我一直在尝试重新实现一个HTML5图像上传器,就像Mozilla Hacks网站上的那个,但它适用于WebKit浏览器。该任务的一部分是从canvas对象中提取图像文件,并将其附加到FormData对象中以便上传。

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

Mozilla解决方案在画布上使用了以下仅限firefox的功能:

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

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

这可能吗?如果没有,有什么替代方案吗?


当前回答

var BlobBuilder = (window.MozBlobBuilder || window.WebKitBlobBuilder || window.BlobBuilder);

可以在没有try捕获的情况下使用。

感谢check_ca。伟大的工作。

其他回答

toDataURL给你一个字符串,你可以把这个字符串放到一个隐藏的输入中。

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' });
}

我和拉文德·帕亚尔遇到了同样的问题,而我找到了答案。试试这个:

var dataURL = canvas.toDataURL("image/jpeg");

var name = "image.jpg";
var parseFile = new Parse.File(name, {base64: dataURL.substring(23)});

我更喜欢的方法是canvas.toBlob()

这里还有另一种方法将base64转换为blob使用fetch ^^,

var url =" data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" fetch (url) .then(res => res.blob()) .then(blob => { var fd = new FormData() fd。Append ('image', blob, 'filename') console.log (blob) / /上传 //取回('上传',{方法:'POST',主体:fd}) })