将数据URI转换为文件,然后附加到FormData

我一直在尝试重新实现像Mozilla Hacks站点上的HTML5图像上传器,但是它可以与WebKit浏览器一起使用。 部分任务是从canvas对象中提取图像文件并将其附加到FormData对象上进行操作。

问题是,虽然canvas具有toDataURL函数以返回图像文件的表示形式,但FormData对象只接受来自File API的File或Blob对象。

Mozilla解决方案在canvas上使用了以下仅限Firefox的功能:

var file = canvas.mozGetAsFile("foo.png");

...这在WebKit浏览器上不可用。 我能想到的最佳解决方案是找到一种方法将数据URI转换为File对象,我认为这可能是File API的一部分,但我无法为我的生活找到可以做到的事情。

可能吗? 如果没有,还有其他的选择

谢谢。


在玩了几件事后,我设法自己弄清楚了这一点。

首先,这会将dataURI转换为Blob:

function dataURItoBlob(dataURI) {
    // convert base64/URLEncoded data component to raw binary data held in a string
    var byteString;
    if (dataURI.split(',')[0].indexOf('base64') >= 0)
        byteString = atob(dataURI.split(',')[1]);
    else
        byteString = unescape(dataURI.split(',')[1]);

    // separate out the mime component
    var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];

    // write the bytes of the string to a typed array
    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});
}

从那里,将数据附加到表单中,以便将其作为文件上传很容易:

var dataURL = canvas.toDataURL('image/jpeg', 0.5);
var blob = dataURItoBlob(dataURL);
var fd = new FormData(document.forms[0]);
fd.append("canvasImage", blob);

现在不建议使用BlobBuilder和ArrayBuffer,这里是使用Blob构造函数更新的顶级注释代码:

function dataURItoBlob(dataURI) {
    var binary = atob(dataURI.split(',')[1]);
    var array = [];
    for(var i = 0; i < binary.length; i++) {
        array.push(binary.charCodeAt(i));
    }
    return new Blob([new Uint8Array(array)], {type: 'image/jpeg'});
}

这一个适用于iOS和Safari。

您需要使用Stoive的ArrayBuffer解决方案,但不能使用BlobBuilder,因为vava720表明,所以这里是两者的混搭。

function dataURItoBlob(dataURI) {
    var byteString = atob(dataURI.split(',')[1]);
    var ab = new ArrayBuffer(byteString.length);
    var ia = new Uint8Array(ab);
    for (var i = 0; i < byteString.length; i++) {
        ia[i] = byteString.charCodeAt(i);
    }
    return new Blob([ab], { type: 'image/jpeg' });
}
链接地址: http://www.djcxy.com/p/5343.html

上一篇: Convert Data URI to File then append to FormData

下一篇: Polymer app refresh strategy