diff options
author | Marvin Borner | 2019-04-17 18:28:04 +0200 |
---|---|---|
committer | Marvin Borner | 2019-04-17 18:28:04 +0200 |
commit | ff98bebada6b000b83259e5ebde48b2deb3a4afd (patch) | |
tree | 19f8557eab4c604ea7bd63b833e221166136b07a | |
parent | b8e81e52f4e12186455b6d17b378f29383d7ce88 (diff) |
Added recursive directory upload algorithm
Co-authored-by: LarsVomMars <lars@kroenner.eu>
-rw-r--r-- | src/main/kotlin/FileController.kt | 6 | ||||
-rw-r--r-- | src/main/resources/js/files.js | 40 |
2 files changed, 31 insertions, 15 deletions
diff --git a/src/main/kotlin/FileController.kt b/src/main/kotlin/FileController.kt index 5586212..29706b1 100644 --- a/src/main/kotlin/FileController.kt +++ b/src/main/kotlin/FileController.kt @@ -110,12 +110,12 @@ class FileController { * Saves multipart media data into requested directory */ fun upload(ctx: Context) { - ctx.uploadedFiles("file").forEach { (_, content, name, _) -> - val path = "${ctx.splats()[0]}/$name" // es gibt kein [content] bei nem dir + ctx.uploadedFiles("file").forEach { (contentType, content, name, extension) -> + val path = "${ctx.splats()[0]}/$name" FileUtil.streamToFile( content, "$fileHome/${userHandler.getVerifiedUserId(ctx)}/$path" - ) // ich würde alle files aus der directory einzeln uploaden <- deshalb das (foreach) + ) databaseController.addFile(path, userHandler.getVerifiedUserId(ctx)) } } diff --git a/src/main/resources/js/files.js b/src/main/resources/js/files.js index ea90f3b..baed543 100644 --- a/src/main/resources/js/files.js +++ b/src/main/resources/js/files.js @@ -2,7 +2,6 @@ * Drag and drop */ const drop = document.getElementById("drop"); - drop.addEventListener('dragover', e => { e.stopPropagation(); e.preventDefault(); @@ -18,11 +17,13 @@ drop.addEventListener('drop', e => { e.stopPropagation(); e.preventDefault(); drop.style.background = "white"; - const files = e.dataTransfer.files; + const items = e.dataTransfer.items; - for (const file of files) { + for (let i = 0; i < items.length; i++) { const request = new XMLHttpRequest(); const formData = new FormData(); + const item = items[i].webkitGetAsEntry(); + const file = items[i].getAsFile(); // TODO: Consider using current date due to updated lastModified state at upload const date = new Date(file.lastModified); @@ -37,16 +38,31 @@ drop.addEventListener('drop', e => { setListeners(); - const reader = new FileReader(); - reader.onload = () => { + const iterateFiles = subItem => { + if (subItem.isDirectory) { + let directoryReader = subItem.createReader(); + directoryReader.readEntries(entries => { + entries.forEach(entry => { + iterateFiles(entry); + }); + }); + } else { + subItem.file(subFile => { + // TODO: Add support for nested directory upload with more than 1 layer + formData.append("file", subFile); + request.open("POST", `/upload/${path}/${file.name}`); + request.send(formData); + }) + } + }; + + if (item.isDirectory) { + iterateFiles(item); + } else { formData.append("file", file); - request.open("POST", "/upload/" + path); + request.open("POST", `/upload/${path}`); request.send(formData); - }; - reader.onerror = () => { - // TODO: Add uploading of directories - }; - reader.readAsText(file) + } } function bytesToSize(bytes) { @@ -55,7 +71,7 @@ drop.addEventListener('drop', e => { const i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024))); return Math.round(bytes / Math.pow(1024, i), 2) + ' ' + sizes[i]; } -}); +}, false); /** * Set up listeners |