50 lines
1.6 KiB
TypeScript
50 lines
1.6 KiB
TypeScript
export default async function getFilesFromDataTransferItems(dataTransferItems: DataTransferItemList) {
|
|
const files: File[] = [];
|
|
|
|
function traverseFileTreePromise(entry: FileSystemEntry | File, item: DataTransferItem) {
|
|
return new Promise((resolve) => {
|
|
if (entry instanceof File) {
|
|
files.push(entry);
|
|
resolve(entry);
|
|
} else if (entry.isFile) {
|
|
const itemFile = item.getAsFile();
|
|
(entry as FileSystemFileEntry).file((file) => {
|
|
files.push(file);
|
|
resolve(file);
|
|
}, () => {
|
|
// iOS Safari throws an error "NotFoundError: Path does not exist" for files from the clipboard
|
|
// https://stackoverflow.com/a/50059309
|
|
if (itemFile) {
|
|
files.push(itemFile);
|
|
}
|
|
resolve(itemFile);
|
|
});
|
|
} else if (entry.isDirectory) {
|
|
const dirReader = (entry as FileSystemDirectoryEntry).createReader();
|
|
dirReader.readEntries((entries) => {
|
|
const entriesPromises = [];
|
|
for (let i = 0; i < entries.length; i++) {
|
|
entriesPromises.push(traverseFileTreePromise(entries[i], item));
|
|
}
|
|
resolve(Promise.all(entriesPromises));
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
const entriesPromises = [];
|
|
for (let i = 0; i < dataTransferItems.length; i++) {
|
|
const item = dataTransferItems[i];
|
|
if (item.kind === 'file') {
|
|
const entry = item.webkitGetAsEntry() || item.getAsFile();
|
|
if (entry) {
|
|
entriesPromises.push(traverseFileTreePromise(entry, item));
|
|
}
|
|
}
|
|
}
|
|
|
|
await Promise.all(entriesPromises);
|
|
|
|
return files;
|
|
}
|