第一个坑
使用微信sdk拿到的图片并没有base64的前缀 所以我们需要自己加
iSrc = 'data:image/jpeg;base64,' + bs64.replace(/\r|\n/g, '');
第二个坑
ok继上一步结束后,我们拿到正常的base64的url后,我们上传还不行,对没错,就是还不行,因为一般的图片的大小都太大了,我们需要进行二进制的压缩,就给他转成 0101000111100000 emmmm…转完就差不多就这样吧…猜测。我们还是看代码吧。
完全可以直接复制,通过调用这个方法把你的base64 url放进去
//完全可以直接复制,通过调用这个方法把你的base64 url放进去
dataURItoBlob(dataURI) {
// convert base64/URLEncoded data component to raw binary data held in a string
let byteString;
if (dataURI.split(',')[0].indexOf('base64') >= 0) {
byteString = atob(dataURI.split(',')[1]);
} else byteString = unescape(dataURI.split(',')[1]);
// separate out the mime component
const mimeString = dataURI
.split(',')[0]
.split(':')[1]
.split(';')[0];
// write the bytes of the string to a typed array
const ia = new Uint8Array(byteString.length);
for (let i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
return new Blob([ia], { type: mimeString });
},
ok…目前这两个坑是最致命的。因为第一次接触微信sdk的话不会想到这些 ,因为毕竟文档写的不是那么直白,很抽象的。。。。应该也算是反程序猿。哎,不多废话了,就这么多吧,到点了,该搬砖了。
附上整体代码,仅供参考
H5部分:
<div class="head_img" slot="left">
<img v-show="this.localIds" :src="this.localIds" alt />
<img src="../../assets/0263117686f629dab4b871d67688585.png" v-show="!this.localIds"/>
</div>
<div slot="default">
<div class="setting_right" @click.stop="update">
<div class="caption">更改头像</div>
</div>
</div>
JS部分:
update(e) {
let _this = this;
let param = new FormData();
wx.chooseImage({
count: 1, // 默认9
sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
success: function(res) {
_this.localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片\
wx.getLocalImgData({
localId: res.localIds[0], // 图片的localID
success: function(ress) {
let bs64 = ress.localData; // localData是图片的base64数据,可以用img标签显示
// 去掉所以换行符
_this.localData = 'data:image/jpeg;base64,' + bs64.replace(/\r|\n/g, '');
console.log(_this.dataURItoBlob(_this.localData));
param.append('file', _this.dataURItoBlob(_this.localData));
_this.$http.put('/api/user_info', param).then(response => {
console.log(response.data);
});
}
});
}
});
},
dataURItoBlob(dataURI) {
// convert base64/URLEncoded data component to raw binary data held in a string
let byteString;
if (dataURI.split(',')[0].indexOf('base64') >= 0) {
byteString = atob(dataURI.split(',')[1]);
} else byteString = unescape(dataURI.split(',')[1]);
// separate out the mime component
const mimeString = dataURI
.split(',')[0]
.split(':')[1]
.split(';')[0];
// write the bytes of the string to a typed array
const ia = new Uint8Array(byteString.length);
for (let i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
return new Blob([ia], { type: mimeString });
},
css部分:
想啥呢... css也要吗?。。。。快,该搬砖了。。。。
各位大佬们,如果小弟那个地方说的不对,还请耽误您1~5秒时间教育一下小弟,毕竟批评会让人进步,对吧…