前端使用微信sdk上传图片的坑,及万千种方法比较实用的一种,亲测有效

vue 公众端使用微信sdk上传图片大坑

第一个坑

使用微信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秒时间教育一下小弟,毕竟批评会让人进步,对吧…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值