需求是想借助chooseImage上传图片,最终获取到压缩后图片的base64。
使用方式如下,前端调用chooseImage 拍照/相册选图上传,sizeType选择compressed压缩,使用uploadImage将图片上传至微信端服务器,再使用download将图片下载至本地,再使用getLocalImgData将获取下载图片的Base64字符串,取Base64串送至应用后台做处理。
出现的问题:ios从本地、相机拍照上传均正常;
安卓端,从相机拍照上传图片,按流程走完,获取到的Base64是一个相对较小的串,通过手机相册和后台日志看,相册中的图片大概在300多K,返回的Base64 (getLocalImageData的localData字段)400-500K;如果使用本地相册上传图片(4.09M),无论sizeType选择compressed或original,手机相册都无法看到下载后的图片,并且getLocalImageData返回的base64的长度一样,均为3604265,感觉是未将上传的图片进行压缩就返回了。
响应代码如下:
let u = navigator.userAgent
if (u.indexOf('Android') > -1 || u.indexOf('Linux') > -1) {
this.mobileType = 'Android'
} else if (u.indexOf('iPhone') > -1) {
this.mobileType = 'iPhone'
}
const _this = this
wx.chooseImage({
count: 1, // 默认9
sizeType: ['compressed'], // 可以指定是原图还是压缩图,默认二者都有
sourceType: ['camera', 'album'], // 可以指定来源是相册还是相机,默认二者都有
fail: function () {
//todo sth
},
success: function (res) {
var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
//upload img
wx.uploadImage({
localId: localIds[0].toString(), // 需要上传的图片的本地ID,由chooseImage接口获得
isShowProgressTips: 1, // 默认为1,显示进度提示
success: function (res) {
var serverId = res.serverId; // 返回图片的服务器端ID
//downloadImg
wx.downloadImage({
serverId: serverId, // 需要下载的图片的服务器端ID,由uploadImage接口获得
isShowProgressTips: 1, // 默认为1,显示进度提示
success: function (res) {
var localId = res.localId; // 返回图片下载后的本地ID
wx.getLocalImgData({
localId: localId,
success: function (res) {
let localData = res.localData
//页面图像预览
if (_this.mobileType === 'Android') {
_this.pic0 = localIds[0]
} else {
_this.pic0 = localData
}
localData = localData.replace("data:image/jpg;base64,", "")
localData = localData.replace("data:image/jpeg;base64,", "")
localData = localData.replace("data:image/jgp;base64,", "")
_this.uploadPic0 = localData //传递至服务端的图片数据
}
})
}
});
}
});
}
});
你好,麻烦补充机型和复现链接
大概半年前问过这个问题,后面因其他事物没继续查了,今天再试发现问题依旧