在javascript中拖放文件时,文件添加到数据传输文件列表的顺序是什么?
我正在构建一个web应用程序,用户可以将图像拖到浏览器中,然后将其拖放以上载。问题是,我希望文件上传的顺序与它们从文件夹中拖出的顺序相同。ondrop事件的DrageEvent.DataTransfer.FileList中的文件似乎是随机排序的。这个订单是如何确定的?我可以确定用户从文件夹中拖出的文件的原始顺序吗?再测试一下,我找到了答案。这些文件与文件夹的顺序相同,但会偏移,以从实际拖动的单个文件开始。因此,如果高亮显示5个文件并通过单击第三个文件并拖动将其拖动,顺序将是文件3、文件4、文件5、文件1、文件2。至于我的第二个问题,找到正确的顺序似乎取决于是否知道拖入的文件的偏移量。我还没有找到一种方法来确定这一点。创建此应用程序是为了进一步研究这一点,按照建议使用promises来处理嵌套目录结构:在javascript中拖放文件时,文件添加到数据传输文件列表的顺序是什么?,javascript,html,drag-and-drop,fileapi,Javascript,Html,Drag And Drop,Fileapi,我正在构建一个web应用程序,用户可以将图像拖到浏览器中,然后将其拖放以上载。问题是,我希望文件上传的顺序与它们从文件夹中拖出的顺序相同。ondrop事件的DrageEvent.DataTransfer.FileList中的文件似乎是随机排序的。这个订单是如何确定的?我可以确定用户从文件夹中拖出的文件的原始顺序吗?再测试一下,我找到了答案。这些文件与文件夹的顺序相同,但会偏移,以从实际拖动的单个文件开始。因此,如果高亮显示5个文件并通过单击第三个文件并拖动将其拖动,顺序将是文件3、文件4、文件5
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中证实了这一点
嵌套目录会变得更加复杂。子目录中文件的顺序将丢失,并且文件将按字母顺序与最后一级子目录一起放置
恐怕这些都是目前数据传输对象作为实验技术的局限性