这是很早以前就在找的一个图片处理方法,由于种种原因base64图片不能直接上传使用,之前为了处理base64也费了很大劲,不想今天竟然找到这段代码。

代码奉上:

一、写一个将base64转换成二进制图片(Blob)的函数

主要思路是整理一下base64的前面几个字符,预处理以后转换成Blob对象,这个之后稍作处理可以放在formData中。

function dataURItoBlob(base64Data) {
    var byteString;
    if (base64Data.split(',')[0].indexOf('base64') >= 0){
        byteString = atob(base64Data.split(',')[1]);
    }else{
        byteString = unescape(base64Data.split(',')[1]);
    }
    var mimeString = base64Data.split(',')[0].split(':')[1].split(';')[0];
    var ia = new Uint8Array(byteString.length);
    for (var i = 0; i < byteString.length; i++) {
        ia[i] = byteString.charCodeAt(i);
    }
    return new Blob([ia], {type:mimeString});
}

二、构建formData

这里需要借助html5的canvas。

var blob = dataURItoBlob(imageBase64); // 上一步中的函数
var canvas = document.createElement('canvas');
var dataURL = canvas.toDataURL('image/jpeg', 0.5);
var fd = new FormData(document.forms[0]);
fd.append("the_file", blob, 'image.png');

上面的the_file为这个文件的key,等效于input中的name,image.png则是文件名,由于base64的图片信息是不带文件名的,所以可以手动指定一个,这个参数是可选的。

三、使用AJAX提交

为方便,这里使用jQuery的Ajax来演示,上面我们已经构建好了名为fd的formData,这里直接提交即可。

$.ajax({
    url: 'http://www.example.com/upload',
    method: 'POST',
    processData: false, // 必须
    contentType: false, // 必须
    dataType: 'json',
    data: fd,
    success:function(data) {
        console.log(data);
    }
});