81 lines
2.7 KiB
JavaScript
81 lines
2.7 KiB
JavaScript
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);
|
|
}
|
|
});
|
|
});
|
|
}
|