我有:

<input type="file" id="f" name="f" onchange="c()" multiple />

每次用户选择文件时,我都会通过将f.files的每个元素推入数组来构建所有选定文件的列表:
var Files = [];
function c() {
  for (var i=0;i<this.files.length;i++) {
    Files.push(this.files[i]);
  };
}

在提交表单时,f.files仅包含上一次选择操作中的项目,因此我将需要使用我累积的f.files项目列表来更新FileList:
const upload=document.getElementById("f");
upload.files = files;

但是第二行给出:



我为它分配一个数组并不高兴。如何从较早收集的FileList元素列表中构造FileList对象?

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

最佳答案

就像你说的
您只能使用FileList设置文件,不幸的是FileList是不可构造的或不可更改的,但是有一种方法可以使文件列表全面

/**
 * @params {array} files List of file items
 * @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)
<input type="file" id="fileInput" multiple />

这样做将触发更改事件,因此您可能需要打开和关闭更改事件侦听器

关于javascript - 是否可以更新FileList?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52078853/

10-09 09:54