可以使用以下代码拖放文件夹(例如,上载包含所有文件的整个子目录树):
function DragAndDrop_Handler(e) {
e.preventDefault();
var items = e.dataTransfer.items;
for (var i=0; i<items.length; i++) {
var item = items[i].webkitGetAsEntry(); //Might be renamed to GetAsEntry() in 2020
if (item) {
GetFileTree(item);
}
}
}
,
function GetFileTree(item, path) {
path = path || "";
if (item.isFile) {
item.file(function(file) {
console.log(file);
UploadFile(file);
});
} else if (item.isDirectory) {
console.log(item.fullPath); //console.log(item.name)
MakeDirectory(item);
// Get contents of the subdirectory
var dirReader = item.createReader();
dirReader.readEntries(function(entries) {
for (var i=0; i<entries.length; i++) {
GetFileTree(entries[i], path + item.name + "/");
}
});
}
}
问题:如何使用标准的文件/目录选择器完成相同的功能?例如:
<input id="BrowseButton" type="file" onchange="FileSelect_Handler(e)" multiple/>
问题是,从 Drag&Drop 操作调用时,........_Handler()
收到一个事件,其中包含类型为e.dataTransfer.items
的{{1}},但是它收到的事件仅包含从标准“文件/目录选择”按钮调用时,类型为DataTransferItemList
的{{1}}。 e.target.files
数据类型不包含任何子目录信息。
我很难相信通过标准的“文件/目录选择”按钮(打开标准的“文件/目录浏览”对话框)不可能获得目录或目录树...但是通过 Drag&Drop 操作可以实现。