如何从Blob创建File对象?

Tom*_*ica 38 javascript fileapi

DataTransferItemList.add允许您在javascript中覆盖复制操作.但是,它只接受File对象.

复制活动

copy活动中的代码:

var items = (event.clipboardData || event.originalEvent.clipboardData);
var files = items.items || items.files;

if(files) {
  var blob = Blob.fromDataURL(_this.editor.selection.getSelectedImage().toDataURL("image/png"));
  files.add(blob);
}
Run Code Online (Sandbox Code Playgroud)

chrome中的错误:

未捕获的类型错误:未能执行addDataTransferItemList:参数1的类型为不File.

试着 new File(Blob blob, DOMString name)

在谷歌浏览器中,我根据当前的规范尝试了这个:

var blob = Blob.fromDataURL(_this.editor.selection.getSelectedImage().toDataURL("image/png"));  
var file = new File(blob, "image.png");
Run Code Online (Sandbox Code Playgroud)

这里的问题是,谷歌浏览器不太符合规格.

未捕获的TypeError:构造失败File:非法构造函数

在这种情况下,Firefox也不是:

方法参数缺失或无效.

试着 new File([Mixed blobParts], DOMString name, BlobPropertyBag options)

@apsillers建议的解决方案也不起作用.这是在FirefoxChrome中使用(但无用)的非标准方法.

二进制数据

我试图避免blob,但文件构造函数仍然失败:

  //Canvas to binary
  var data = atob(   //atob (array to binary) converts base64 string to binary string
    _this.editor.selection.getSelectedImage()  //Canvas
    .toDataURL("image/png")                    //Base64 URI
    .split(',')[1]                             //Base64 code
  );
  var file = new File([data], "image.png", {type:"image/png"}); //ERROR
Run Code Online (Sandbox Code Playgroud)

你可以在控制台中尝试:

Chrome <38:
谷歌Chrome是迟钝的 Chrome> = 38:
谷歌铬不再迟钝 Firefox: firefox firebug fileAPI

斑点

传递Blob可能是正确的,适用于Firefox:

var file = new File([new Blob()], "image.png", {type:"image/png"});
Run Code Online (Sandbox Code Playgroud)

火狐:
Firefox firebug
Chrome <38:
谷歌Chrome是迟钝的
Chrome> = 38:
谷歌铬不再迟钝

  • 问:那么,如何能够使FileBlob

注意:我在@apsillers提醒我更新Google Chrome后添加了更多屏幕截图.

pwn*_*all 87

File构造函数(以及Blob构造函数)接受一系列部件.部件不必是DOMString.它也可以是Blob,File或类型化数组.您可以轻松地从Blob构建文件,如下所示:

new File([blob], "filename")

如果您没有花时间了解规范流程或规范本身,请不要声明浏览器没有实现规范或规范是无用的.

  • 浏览器实现者总是使用ED.使用ED的缺点是某些/大多数浏览器可能落后.一般来说,使用TR应该没问题.File API TR真的很老(比ED落后1年),总的来说它们赶上的速度要快得多.我认为在大多数情况下,Chromium在规格达到TR之前不会发布API.在这种情况下,Firefox真的想要Firefox OS的File构造函数,所以他们发布了它.ED文件改变了他们要求的(这是好的,顺便说一下).自Firefox发布以来,我认为也可以在Chromium中发布构造函数. (3认同)
  • 谢谢你同情我:).如果没有任何结果,你不会相信我正在做多少挖掘.我已经习惯了其他语言,但使用javascript这是第一次. (2认同)
  • 不好意思,早点接您!我在Chromium的错误跟踪器上阅读了您的错误描述,并做了一些勾勾。祝您的代码好运! (2认同)

Har*_*nki 12

这是我必须用来将 blob 转换为文件的完整语法,后来我不得不使用我的服务器将其保存到一个文件夹中。

var file = new File([blob], "my_image.png",{type:"image/png", lastModified:new Date().getTime()})
Run Code Online (Sandbox Code Playgroud)


小智 7

这对我有用,从画布到文件[或Blob],带有文件名!

var dataUrl = canvas.toDataURL('image/jpeg');
var bytes = dataUrl.split(',')[0].indexOf('base64') >= 0 ?
          atob(dataUrl.split(',')[1]) :
          (<any>window).unescape(dataUrl.split(',')[1]);
var mime = dataUrl.split(',')[0].split(':')[1].split(';')[0];
var max = bytes.length;
var ia = new Uint8Array(max);
for (var i = 0; i < max; i++) {
  ia[i] = bytes.charCodeAt(i);
}

var newImageFileFromCanvas = new File([ia], 'fileName.jpg', { type: mime });
Run Code Online (Sandbox Code Playgroud)

或者如果你想要一个斑点

var blob = new Blob([ia], { type: mime });
Run Code Online (Sandbox Code Playgroud)