可以通过更改可写属性描述符来更改JavaScript文件名吗?

时间:2019-04-02 09:35:53

标签: javascript forms

在上传文件之前,我需要更改文件名,但该属性为只读:

https://developer.mozilla.org/en-US/docs/Web/API/File

如此

this.imageFile.name = newFileName;

不起作用。

我在这里查看了其他问题,但答案都是-“使用文件构造器创建新文件”。

例如

var file = new File(['foo'], 'newName', {type:'img/jpg'});

但是构造函数在IE或edge中不可用。

最后,我发现caniuse.com上的表单数据具有良好的支持,您可以提供一个新的文件名,如下所示:

var newFileName = file.filename + "new";
var formData = new FormData();
formData.append('file', file, newFileName);

在这两种解决方案之间,我尝试了另一种方法:

Object.defineProperty(this.imageFile, 'name', {
     writable: true
});

this.imageFile.name = newFileName; 

很明显,这是一个hack,但确实有效。我决定不使用它,因为FormData append方法采用文件名来解决此问题,如果我可以手动更改描述符,并且它可以正常工作,我只是不明白为什么它是只读属性。

1 个答案:

答案 0 :(得分:0)

  

我只是不明白为什么它是一个只读属性...

因为specification这样说:

  

在进行引用时,用户代理应努力将File对象的快照状态设置为磁盘上基础存储的状态。

interface File : Blob {
  readonly attribute DOMString name;
  readonly attribute long long lastModified;
};

name属性表示当前文件名,因此,不能在File对象中进行更改。

尽管,当您使用带有第三个参数的FormData.append()将此文件的内容发送到服务器时,此操作不会更改文件状态或它表示的基础存储。