aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarvin Borner2019-04-17 18:28:04 +0200
committerMarvin Borner2019-04-17 18:28:04 +0200
commitff98bebada6b000b83259e5ebde48b2deb3a4afd (patch)
tree19f8557eab4c604ea7bd63b833e221166136b07a
parentb8e81e52f4e12186455b6d17b378f29383d7ce88 (diff)
Added recursive directory upload algorithm
Co-authored-by: LarsVomMars <lars@kroenner.eu>
-rw-r--r--src/main/kotlin/FileController.kt6
-rw-r--r--src/main/resources/js/files.js40
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