将数据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