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

新手上路,请多包涵

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

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

Mozilla 解决方案在 canvas 上使用了以下 Firefox-only 功能:

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

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

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

原文由 Stoive 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 766
2 个回答

在玩了几件事之后,我设法自己解决了这个问题。

首先,这会将 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);

原文由 Stoive 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

原文由 vava720 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题