如何在 JavaScript 中实例化 File 对象?

IT技术 javascript file-upload upload
2021-01-12 03:43:16

FileJavaScript 中有一个对象。我想实例化一个用于测试目的。

我试过了new File(),但我收到“非法构造函数”错误。

是否可以创建File对象?


文件对象参考:https : //developer.mozilla.org/en/DOM/File

6个回答

根据 W3C File API 规范,File 构造函数需要 2(或 3)个参数。

因此,要创建一个空文件,请执行以下操作:

var f = new File([""], "filename");
  • 第一个参数是作为文本行数组提供的数据;
  • 第二个参数是文件名;
  • 第三个参数看起来像:

    var f = new File([""], "filename.txt", {type: "text/plain", lastModified: date})
    

它适用于 FireFox、Chrome 和 Opera,但不适用于 Safari 或 IE/Edge。

对于 IE11,您可以使用 Blob 类来构造一个 File 对象。这对我来说似乎是最便携的解决方案。 file = new Blob([blobdata], {type: filetype, lastModified: filelastModified}); file.name = filename
2021-03-15 03:43:16
windows edge 有什么替代方法?
2021-03-19 03:43:16
@ PA.Buisson我不知道这是否适用于所有的情况下(这是足以让我),但你可以使用BLOB()构造函数来代替,如建议在这里
2021-03-29 03:43:16
这在 Firefox 28+、Chrome 38+ 和 Opera 25+ 中确实有效但是,Safari 和 IE 今天仍然没有实现这个构造函数(参见caniuse.com/#feat=fileapi)。我目前正在寻找一种 polyfill 或一种模拟它的方法,但到目前为止还没有找到任何合适的解决方案。
2021-04-06 03:43:16
Illegal constructor在 Chrome 37 / Ubuntu 上生成所以没有它不起作用
2021-04-09 03:43:16

现在你可以!

var parts = [
  new Blob(['you construct a file...'], {type: 'text/plain'}),
  ' Same way as you do with blob',
  new Uint16Array([33])
];

// Construct a file
var file = new File(parts, 'sample.txt', {
    lastModified: new Date(0), // optional - default = now
    type: "overide/mimetype" // optional - default = ''
});

var fr = new FileReader();

fr.onload = function(evt){
   document.body.innerHTML = evt.target.result + "<br><a href="+URL.createObjectURL(file)+" download=" + file.name + ">Download " + file.name + "</a><br>type: "+file.type+"<br>last modified: "+ file.lastModifiedDate
}

fr.readAsText(file);

刚刚测试过,它也不适用于 35。请调整您的答案以反映这仅适用于 Firefox 的事实。
2021-03-16 03:43:16
然后我将在您运行时验证它是否在 Chrome 35 OSX 中工作 new File([], '')
2021-03-20 03:43:16
不,它在 Chrome 中不起作用。请参阅code.google.com/p/chromium/issues/detail?id=164933验证它在 Chrome 36 OSX 中不起作用。
2021-03-23 03:43:16
Illegal constructor在 Chrome 37 / Ubuntu 上生成
2021-03-25 03:43:16
嗯,你说得对。它只对我有用,因为我激活了一个实验性的 chrome 标志...... dl.dropboxusercontent.com/u/3464804/jCmQr8vrGk.gif
2021-04-09 03:43:16

更新

BlobBuilder 已过时,如果您将其用于测试目的,请查看您如何使用它。

否则,将以下内容与转到Blob 的迁移策略一起应用,例如此问题的答案

改用 Blob

作为替代方案,您可以使用Blob代替File,因为它是根据W3C 规范派生的 File 接口

interface File : Blob {
    readonly attribute DOMString name;
    readonly attribute Date lastModifiedDate;
};

File 接口基于 Blob,继承 Blob 功能并对其进行扩展以支持用户系统上的文件。

创建 Blob

像这样在现有的 JavaScript 方法上使用BlobBuilder,该方法需要通过 File 上传XMLHttpRequest并为其提供 Blob,这样可以正常工作:

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

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://jsfiddle.net/img/logo.png', true);

xhr.responseType = 'arraybuffer';

bb.append(this.response); // Note: not xhr.responseText

//at this point you have the equivalent of: new File()
var blob = bb.getBlob('image/png');

/* more setup code */
xhr.send(blob);

扩展示例

示例的其余部分以更完整的方式jsFiddle发布,但无法成功上传,因为我无法以长期方式公开上传逻辑。

不幸的是,BlobBuilder 已经过时了:developer.mozilla.org/en-US/docs/Web/API/BlobBuilder
2021-03-22 03:43:16
此代码不会运行。类型错误:BlobBuilder 不是构造函数
2021-03-30 03:43:16
此评论已过时。不要使用 BlobBuilder,使用 Blob 构造函数。Blob(['mythingy'], { type: "thingy" })
2021-04-07 03:43:16
DataTransferItemList.add需要FileBlob所以对于最初的问题:如何实例化File
2021-04-09 03:43:16

现在所有主要浏览器都可以并支持:https : //developer.mozilla.org/en-US/docs/Web/API/File/File

var file = new File(["foo"], "foo.txt", {
  type: "text/plain",
});
尽管这么说让我很痛苦,但 Edge 是一个主要的浏览器。
2021-03-17 03:43:16
我没有看到很多人实际上使用它。caniuse.com/#feat=fileapi - IE 2.6%,Edge - 1.4%,Opera Mini - 2.7%。netmarketshare.com/browser-market-share.aspx 上为 4.3%。如果您关心 Edge,则需要找到一些解决方法developer.microsoft.com/en-us/microsoft-edge/platform/issues/...
2021-03-19 03:43:16
Evestigneev 您误解了结果,因为支持的浏览器的全球使用率约为 0.2%。这个数字是使用 api 的浏览器数量,而 edge / IE 本身约占仍在使用的浏览器的 15%。
2021-03-29 03:43:16

这个想法......在javaScript中为DOM中已经存在的图像创建一个文件对象(api):

<img src="../img/Products/fijRKjhudDjiokDhg1524164151.jpg">

var file = new File(['fijRKjhudDjiokDhg1524164151'],
                     '../img/Products/fijRKjhudDjiokDhg1524164151.jpg', 
                     {type:'image/jpg'});

// created object file
console.log(file);

不要那样做!......(但我还是做到了)

-> 控制台给出类似于对象文件的结果:

File(0) {name: "fijRKjokDhgfsKtG1527053050.jpg", lastModified: 1527053530715, lastModifiedDate: Wed May 23 2018 07:32:10 GMT+0200 (Paris, Madrid (heure d’été)), webkitRelativePath: "", size: 0, …}
lastModified:1527053530715
lastModifiedDate:Wed May 23 2018 07:32:10 GMT+0200 (Paris, Madrid (heure d’été)) {}
name:"fijRKjokDhgfsKtG1527053050.jpg"
size:0
type:"image/jpg"
webkitRelativePath:""__proto__:File

但是对象的大小是错误的...

为什么我需要这样做?

例如,在产品更新期间重新传输已上传的图像表单以及更新期间添加的其他图像