繁体   English   中英

如何在JavaScript中创建File对象的修改后的副本?

[英]How to create a modified copy of a File object in JavaScript?

<input type="file">接收的文件的属性是只读的。

例如,以下尝试重写file.name尝试将失败,或者无提示失败或引发TypeError: Cannot assign to read only property 'name' of object '#<File>'

<input onchange="onchange" type="file">
onchange = (event) => {
    const file = event.target.files[0];
    file.name = 'foo';
}

尝试通过Object.assign({}, file)创建副本失败(创建一个空对象)。

那么,如何克隆一个File对象呢?

我的解决方案位于File构造函数中:

https://developer.mozilla.org/zh-CN/docs/Web/API/File#Implementation_notes

它本身是Blob的扩展:

https://developer.mozilla.org/zh-CN/docs/Web/API/Blob/Blob

let file = event.target.files[0];
if (this.props.distro) {
    const name = 'new-name-here' + // Concat with file extension.
        file.name.substring(file.name.lastIndexOf('.'));
    // Instantiate copy of file, giving it new name.
    file = new File([file], name, { type: file.type });
}

请注意, File()的第一个参数必须是一个数组,而不仅仅是原始文件。

您可以使用FormData.prototype.append() ,它还将Blob转换为File对象。

let file = event.target.files[0];
let data = new FormData();
data.append("file", file, file.name);
let _file = data.get("file");

更多跨浏览器解决方案

可接受的答案在现代浏览器中也对我有用,但是不幸的是,它在IE11中不起作用 ,因为IE11不支持File构造函数 但是,IE11确实支持Blob构造函数,因此可以将其用作替代方法。

例如:

var newFile  = new Blob([originalFile], {type: originalFile.type});
newFile.name = 'copy-of-'+originalFile.name;
newFile.lastModifiedDate = originalFile.lastModifiedDate;

来源: MSDN-如何使用HTML 5文件API创建文件实例?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM