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 = []; let subfolder = []; folder.push({ name: item.name, subfolder: subfolder }); for (let entry of entries) entriesPromises.push( traverseFileTreePromise(entry, 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(), "", files) ); Promise.all(entriesPromises).then(entries => { resolve(files); }); }); } export function get_files_data_transfer_items(data_transfer_items) { return getFilesDataTransferItems(data_transfer_items); }