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

时间:2011-12-05 19:42:09

标签: javascript file-upload upload

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

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

是否可以创建File对象?


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

6 个答案:

答案 0 :(得分:159)

根据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。

答案 1 :(得分:24)

现在你可以!



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);
&#13;
&#13;
&#13;

答案 2 :(得分:18)

  

<强>更新

     

BlobBuilder已经obsoleted了解您如何使用它,如果您将其用于测试目的。

     

否则请将以下内容应用于转到 Blob 的迁移策略,例如this question的答案。

改为使用Blob

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

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

File接口基于Blob,继承blob功能并将其扩展为支持用户系统上的文件。

创建Blob

在现有的JavaScript方法上使用这样的BlobBuilder,通过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更加完整,但无法成功上传,因为我无法长期暴露上传逻辑。

答案 3 :(得分:1)

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

var file = new File(["foo"], "foo.txt", {
  type: "text/plain",
});

答案 4 :(得分:0)

想法......在javaScript中为已存在于DOM中的图像创建File对象(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);

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

- &GT;控制台提供类似于对象文件的结果:

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

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

为什么我需要这样做?

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

答案 5 :(得分:-2)

因为这是javascript和动态的,你可以定义自己的类与File接口匹配,然后使用它。

我必须使用dropzone.js,因为我想模拟文件上传,它适用于File对象。