背景:taro框架开发微信小程序,上传图片
问题:
- 需求:上传图片做了大于5M终止上传并提示,且上传图片的格式限制为:png/jpg/jpeg
- 结果:在微信开发者工具上两个逻辑是没有问题的,但是在手机上预览时,却不对。
上传5.5M的图片后,并没有终止上传而是提示框内显示:压缩…
上传gif图片后,也没有终止上传,打印结果图片格式为** .jpg**
代码如下:
Taro.chooseMedia({
count: 1, // 默认9
mediaType: ['image'],
sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
success: function (res) {
console.log('upload - res', res)
if (res.tempFiles[0].size > 5 * 1024 * 1024) {
Taro.showToast({
title: '图片不能大于5M',
icon: 'none',
})
return
}
Taro.getImageInfo({
src: res.tempFiles[0].tempFilePath,
success(info) {
const allowedExtensions = ['jpg', 'jpeg', 'png']
if (!allowedExtensions.includes(info.type?.toLowerCase())) {
Taro.showToast({
title: '仅支持 JPG/PNG 格式',
icon: 'none',
})
return
}
// 上传逻辑...
},
})
},
})
发现的问题是:
wx.chooseMedia这个API的sizeType配置,如果选择了compressed,微信小程序在上传图片时会进行压缩
- 接近5M的图片,会被压缩为不到5M
- gif图片在压缩后,格式为jpg的图片
微信小程序在上传图片时会进行自动压缩,主要原因是:
-
微信为了优化性能和用户体验,会对选择的图片进行默认压缩
-
压缩后的图片大小会远小于原图,导致您设置的大小限制条件无法按预期工作
修改后的代码:去掉 ‘compressed’ 选项
Taro.chooseMedia({
count: 1, // 默认9
mediaType: ['image'],
sizeType: ['original'], // 只能选择原图
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
success: function (res) {
console.log('upload - res', res)
if (res.tempFiles[0].size > 5 * 1024 * 1024) {
Taro.showToast({
title: '图片不能大于5M',
icon: 'none',
})
return
}
Taro.getImageInfo({
src: res.tempFiles[0].tempFilePath,
success(info) {
const allowedExtensions = ['jpg', 'jpeg', 'png']
if (!allowedExtensions.includes(info.type?.toLowerCase())) {
Taro.showToast({
title: '仅支持 JPG/PNG 格式',
icon: 'none',
})
return
}
// 上传逻辑...
},
})
},
})