function getFilesDataTransferItems(dataTransferItems) { function traverseFileTreePromise(item, path = "", folder) { return new Promise(resolve => { if (item === null || typeof item === 'undefined') { // nothing to do } else 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) { let entry; if (typeof it.webkitGetAsEntry === 'function') { entry = it.webkitGetAsEntry(); } else if (typeof it.getAsEntry === 'function') { entry = it.getAsEntry(); } entriesPromises.push( traverseFileTreePromise(entry, "", files) ); } Promise.all(entriesPromises).then(entries => { resolve(files); }); }); } export function get_files_data_transfer_items(data_transfer_items) { return getFilesDataTransferItems(data_transfer_items); } export function read_file(file) { return new Promise((resolve, reject) => { let reader = new FileReader(); reader.onloadend = () => { resolve(reader.result) }; reader.onerror = reject; reader.readAsArrayBuffer(file); }); } export function upload(content, content_type, url) { return new Promise((resolve, reject) => { fetch(url, { method: 'PUT', headers: { 'Accept': 'application/json', 'Content-Type': 'multipart/form-data', }, body: new Blob([content], { type: content_type }), }).then((resp) => { if (resp.status >= 200 && resp.status < 300) { resolve(resp); } else { reject(resp); } }); }); }