首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有可能更新FileList吗?

有可能更新FileList吗?
EN

Stack Overflow用户
提问于 2018-08-29 13:39:22
回答 2查看 42.9K关注 0票数 42

我有:

代码语言:javascript
复制
<input type="file" id="f" name="f" onchange="c()" multiple />

每次用户选择一个文件时,我都会通过将f.files的每个元素推到一个数组中来构建所有选定文件的列表:

代码语言:javascript
复制
var Files = [];
function c() {
  for (var i=0;i<this.files.length;i++) {
    Files.push(this.files[i]);
  };
}

在表单提交时,f.files只包含上次select操作中的项,因此我需要用我积累的FileList项列表更新FileList

代码语言:javascript
复制
const upload=document.getElementById("f");
upload.files = files;

但是第二行给出了:

Uncaught :未能在‘HTMLInputElement’上设置‘file’属性:提供的值不是'FileList‘类型。

我给它分配了一个数组,这令人不高兴。如何从前面收集的FileList元素列表中构造FileList对象?

附带问题:我认为Javascript使用动态类型。为什么它在这里抱怨错误的类型?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-29 13:52:58

就像你说的

未能在“HTMLInputElement”上设置“file”属性:提供的值不是“FileList”类型。

您只能使用FileList实例来设置文件,不幸的是,FileList是不可构造的或可变的,但是有一种方法可以大致地获得一个文件。

代码语言:javascript
复制
/**
 * @params {File[]} files Array of files to add to the FileList
 * @return {FileList}
 */
function FileListItems (files) {
  var b = new ClipboardEvent("").clipboardData || new DataTransfer()
  for (var i = 0, len = files.length; i<len; i++) b.items.add(files[i])
  return b.files
}

var files = [
  new File(['content'], 'sample1.txt'),
  new File(['abc'], 'sample2.txt')
];


fileInput.files = new FileListItems(files)
console.log(fileInput.files)
代码语言:javascript
复制
<input type="file" id="fileInput" multiple />

执行此操作将触发更改事件,因此您可能希望打开和关闭更改事件侦听器。

票数 45
EN

Stack Overflow用户

发布于 2019-06-04 16:24:49

您不能修改Filelist,但是可以使用DataTransfer对象创建一个新的文件,如果您愿意,您可以将数据复制到其中,以创建一个具有特定更改的副本。

代码语言:javascript
复制
let list = new DataTransfer();
let file = new File(["content"], "filename.jpg");
list.items.add(file);

let myFileList = list.files;

然后,可以将其设置为DOM节点的file属性:

代码语言:javascript
复制
fileInput.files = myFileList;

如果您愿意,可以在旧FileList上迭代,将文件复制到新的文件中。

票数 75
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52078853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档