fixed upload files in the nested levels of folders

This commit is contained in:
Milos Holba
2021-08-11 17:15:02 +02:00
parent 717f28608f
commit ec2a10e32f
4 changed files with 144 additions and 67 deletions
+27 -33
View File
@@ -185,16 +185,6 @@ const Helpers = {
})
}
// Push items to file queue
// [...event.dataTransfer.items].map(item => {
// console.log(item.getAsFile(), 'b')
// this.$store.commit('ADD_FILES_TO_QUEUE', {
// folder_id: parent_id ? parent_id : '',
// file: item.getAsFile(),
// })
// });
// Start uploading if uploading process isn't running
if (this.$store.getters.filesInQueueTotal == 0)
this.$handleUploading(this.$store.getters.fileQueue[0])
@@ -203,6 +193,7 @@ const Helpers = {
this.$store.commit('INCREASE_FILES_IN_QUEUES_TOTAL', items.length)
}
// Get File from FileEntry
Vue.prototype.$getFile = async function (fileEntry) {
try {
return await new Promise((resolve, reject) => fileEntry.file(resolve, reject));
@@ -212,10 +203,11 @@ const Helpers = {
}
Vue.prototype.$getAllFileEntries = async function (dataTransferItemList) {
let fileEntries = [];
// Use BFS to traverse entire directory/file structure
let queue = [];
// Unfortunately dataTransferItemList is not iterable i.e. no forEach
for (let i = 0; i < dataTransferItemList.length; i++) {
queue.push(dataTransferItemList[i].webkitGetAsEntry());
}
@@ -224,32 +216,34 @@ const Helpers = {
if (entry.isFile) {
fileEntries.push(entry);
} else if (entry.isDirectory) {
queue.push(...await this.$readAllDirectoryEntries(entry.createReader()));
queue.push(...await readAllDirectoryEntries(entry.createReader()));
}
}
async function readAllDirectoryEntries (directoryReader) {
let entries = [];
let readEntries = await readEntriesPromise(directoryReader);
while (readEntries.length > 0) {
entries.push(...readEntries);
readEntries = await readEntriesPromise(directoryReader);
}
return entries;
}
async function readEntriesPromise (directoryReader) {
try {
return await new Promise((resolve, reject) => {
directoryReader.readEntries(resolve, reject);
});
} catch (err) {
console.log(err);
}
}
return fileEntries;
}
Vue.prototype.$readAllDirectoryEntries = async function (directoryReader) {
let entries = [];
let readEntries = await this.$readEntriesPromise(directoryReader);
while (readEntries.length > 0) {
entries.push(...readEntries);
readEntries = await this.$readEntriesPromise(directoryReader);
}
return entries;
}
Vue.prototype.$readEntriesPromise = async function (directoryReader) {
try {
return await new Promise((resolve, reject) => {
directoryReader.readEntries(resolve, reject);
});
} catch (err) {
console.log(err);
}
}
Vue.prototype.$handleUploading = async function (item) {
// Create ceil
+7 -2
View File
@@ -164,7 +164,7 @@ const actions = {
})
.catch(() => Vue.prototype.$isSomethingWrong())
},
uploadFiles: ({commit, getters}, {form, fileSize, totalUploadedSize}) => {
uploadFiles: ({commit, getters, dispatch}, {form, fileSize, totalUploadedSize}) => {
return new Promise((resolve, reject) => {
// Get route
@@ -222,8 +222,13 @@ const actions = {
}
// Reset upload process
if (!getters.fileQueue.length)
if (!getters.fileQueue.length) {
commit('CLEAR_UPLOAD_PROGRESS')
// Reload files after upload is done
dispatch('getFolder', [{folder: getters.currentFolder, back: true, init: false}])
}
}
})
.catch(error => {