在javascript中拖放文件时,文件添加到数据传输文件列表的顺序是什么?

在javascript中拖放文件时,文件添加到数据传输文件列表的顺序是什么?,javascript,html,drag-and-drop,fileapi,Javascript,Html,Drag And Drop,Fileapi,我正在构建一个web应用程序,用户可以将图像拖到浏览器中,然后将其拖放以上载。问题是,我希望文件上传的顺序与它们从文件夹中拖出的顺序相同。ondrop事件的DrageEvent.DataTransfer.FileList中的文件似乎是随机排序的。这个订单是如何确定的?我可以确定用户从文件夹中拖出的文件的原始顺序吗?再测试一下,我找到了答案。这些文件与文件夹的顺序相同,但会偏移,以从实际拖动的单个文件开始。因此,如果高亮显示5个文件并通过单击第三个文件并拖动将其拖动,顺序将是文件3、文件4、文件5

我正在构建一个web应用程序,用户可以将图像拖到浏览器中,然后将其拖放以上载。问题是,我希望文件上传的顺序与它们从文件夹中拖出的顺序相同。ondrop事件的DrageEvent.DataTransfer.FileList中的文件似乎是随机排序的。这个订单是如何确定的?我可以确定用户从文件夹中拖出的文件的原始顺序吗?

再测试一下,我找到了答案。这些文件与文件夹的顺序相同,但会偏移,以从实际拖动的单个文件开始。因此,如果高亮显示5个文件并通过单击第三个文件并拖动将其拖动,顺序将是文件3、文件4、文件5、文件1、文件2。至于我的第二个问题,找到正确的顺序似乎取决于是否知道拖入的文件的偏移量。我还没有找到一种方法来确定这一点。

创建此应用程序是为了进一步研究这一点,按照建议使用promises来处理嵌套目录结构:

  function getFilesDataTransferItems(dataTransferItems) {
   function traverseFileTreePromise(item, path = "", folder) {
    return new Promise(resolve => {
        if (item.isFile) {
            item.file(file => {
                file.filepath = path || "" + file.name; //save full path
                folder.push(file);
                resolve(file);
            });
        } else if (item.isDirectory) {
            let dirReader = item.createReader();
            dirReader.readEntries(entries => {
                let entriesPromises = [];
                subfolder = [];
                folder.push({name: item.name, subfolder: subfolder});
                for (let entr of entries)
                    entriesPromises.push(
                        traverseFileTreePromise(entr, path || "" + item.name + "/", subfolder)
                    );
                resolve(Promise.all(entriesPromises));
            });
        }
    });
  }

  let files = [];
  return new Promise((resolve, reject) => {
    let entriesPromises = [];
    for (let it of dataTransferItems)
        entriesPromises.push(
            traverseFileTreePromise(it.webkitGetAsEntry(), null, files)
        );
    Promise.all(entriesPromises).then(entries => {
        resolve(files);
    });
  });
}
正如Andrew指出的,当通过拖放和数据传输导入一组选定的文件时,这些文件将使用首先拖动的文件重新排序,然后包装到实际的第一个文件。在Chrome和Firefox中证实了这一点

嵌套目录会变得更加复杂。子目录中文件的顺序将丢失,并且文件将按字母顺序与最后一级子目录一起放置

恐怕这些都是目前数据传输对象作为实验技术的局限性