JavaScript中有一个 File
对象, 我想为测试目的实例化一个。
我已经尝试使用 new File()
,但是我得到了一个“非法构造函数”的错误。
是否有可能创建一个File
对象?
参考 File 对象 : https://developer.mozilla.org/zh-CN/docs/Web/API/File
JavaScript中有一个 File
对象, 我想为测试目的实例化一个。
我已经尝试使用 new File()
,但是我得到了一个“非法构造函数”的错误。
是否有可能创建一个File
对象?
参考 File 对象 : https://developer.mozilla.org/zh-CN/docs/Web/API/File
var f = new File([""], "filename");
第三个参数看起来像:
var f = new File([""], "filename.txt", {type: "text/plain", lastModified: date})
它能在FireFox、Chrome和Opera中工作,但无法在Safari或IE/Edge中工作。
file = new Blob([blobdata], {type: filetype, lastModified: filelastModified}); file.name = filename
- Jesse Hogan现在你可以了!
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);
new File([], '')
时,它在Chrome 35 OSX中可以正常工作。 - Endless更新
BlobBuilder已被弃用,如果你正在用它进行测试,请看看是否可以使用其他方法。
否则,可以采用下面的迁移策略,使用Blob代替,例如这个问题的答案。
作为一种替代方案,可以使用Blob来代替File,因为根据W3C规范,File接口是从Blob继承而来的:
interface File : Blob {
readonly attribute DOMString name;
readonly attribute Date lastModifiedDate;
};
基于Blob的File接口,继承了Blob的功能并扩展以支持用户系统中的文件。
使用BlobBuilder可以将一个Blob提供给现有的JavaScript方法,该方法通过XMLHttpRequest
上传File,像这样就可以正常工作:
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上找到,以更完整的形式呈现,但无法成功上传,因为我不能长期地暴露上传逻辑。
DataTransferItemList.add
需要 File
而不是 Blob
。那么对于最初的问题:如何实例化一个 File? - Tomáš Zato现在所有主要浏览器都支持这一功能: https://developer.mozilla.org/en-US/docs/Web/API/File/File
var file = new File(["foo"], "foo.txt", {
type: "text/plain",
});
<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
但对象的大小不正确...
为什么我需要这样做?
例如,在产品更新期间重新传输已上传的图像,以及在更新过程中添加的其他图像。