微信选择图片转换为文件

Posted by Chen Blog on July 11, 2019

最近遇到一个需求。需要用户在手机段选择图片然后上传。我们客户端都是微信浏览器打开的,所以使用了微信jssdk提供的选择图片非常的方便就可以选择图片。而且还很好用。但是我们想要将微信选择的图片转换为文件的方式上传上来。或者直接将文件上传到阿里云oss里面去。 所以就踩了很多微信选择图片转文件类型的坑

直接上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/**
 * 符合微信的dataURL转文件类型
 * @param dataURI
 * @param filename 文件名
 * @returns File
 * @author zhangrongdong <admin@zrongdong.com>
 */
function dataURLtoFile(dataURI, filename) {
    let byteString, mimeString;

    // 查找字符串是否存在
    if (dataURI.indexOf(',') >= 0) {
        byteString = atob(dataURI.split(',')[1]);
        mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
    } else {
        byteString = atob(dataURI);
        mimeString = 'image/png';
    }

    let n = byteString.length;
    let u8arr = new Uint8Array(n);
    while (n--) {
        u8arr[n] = byteString.charCodeAt(n);
    }
    return new File([u8arr], filename, {type: mimeString});
}

/**
 * 符合微信的dataURI转blob类型
 * @param dataURI
 * @returns {Blob}
 * @author zhangrongdong <admin@zrongdong.com>
 */
function dataURItoBlob(dataURI) {
    let byteString, mimeString;

    // 查找字符串是否存在
    if (dataURI.indexOf(',') >= 0) {
        byteString = atob(dataURI.split(',')[1]);
        mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
    } else {
        byteString = atob(dataURI);
        mimeString = 'image/png';
    }
    // write the bytes of the string to an ArrayBuffer
    let ab = new ArrayBuffer(byteString.length);
    let ia = new Uint8Array(ab);
    for (let i = 0; i < byteString.length; i++) {
        ia[i] = byteString.charCodeAt(i);
    }

    return new Blob([ab], {type: mimeString});
}

调用示例和说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
wx.getLocalImgData({
    localId: wxImageId,  //需要上传的图片的本地ID,由chooseImage接口获得
    success: function (res) {
        let localData = res.localData;
        let imageBase64 = '';
        if (localData.indexOf('data:image') >= 0) {
			// 苹果手机获取到的图片是jgp的 这里我不做处理了。
			// if(localData.indexOf('image/jgp') >= 0){
			//		localData = localData.replace('image/jgp', 'image/jpg');
			// }
            //苹果默认生成'data:image/jgp;base64,'的头部
            imageBase64 = localData.split(',')[1];
        } else {
            // 安卓手机的需要全局替换一下
            imageBase64 = localData.replace(/\n/g, '');
        }
        let fileImage = dataURLtoFile(imageBase64 , 'test.jpg');
		// 然后接下来你就把你的图片拿去用或者上传
    },
    fail: function (res) {
        alert(JSON.stringify(res));
    }
});

参考资料