about summary refs log tree commit diff
path: root/uploader/static/js
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2024-12-20 12:51:25 -0600
committerFrederick Muriuki Muriithi2024-12-20 12:51:25 -0600
commit60c2c223c40b186d83d78c07261907ab84f87254 (patch)
treeb1e7bf124367a68639d1352437164219654f4c1e /uploader/static/js
parentdaf5036f3e15212a3afbc16a3d1fc8549453f9c2 (diff)
downloadgn-uploader-60c2c223c40b186d83d78c07261907ab84f87254.tar.gz
Add javascript to handle resumable, chunked file uploads.
Diffstat (limited to 'uploader/static/js')
-rw-r--r--uploader/static/js/files.js102
1 files changed, 102 insertions, 0 deletions
diff --git a/uploader/static/js/files.js b/uploader/static/js/files.js
index 017ea3e..26092f7 100644
--- a/uploader/static/js/files.js
+++ b/uploader/static/js/files.js
@@ -15,3 +15,105 @@ var readFirstNLines = (fileelement, count, process_content_fns) => {
     }
 };
 var read_first_n_lines = readFirstNLines;
+
+
+var readBinaryFile = (file) => {
+    return new Promise((resolve, reject) => {
+        var _reader = new FileReader();
+        _reader.onload = (event) => {resolve(_reader.result);};
+        _reader.readAsArrayBuffer(file);
+    });
+};
+
+
+var Uint8ArrayToHex = (arr) => {
+    var toHex = (val) => {
+        _hex = val.toString(16);
+        if(_hex.length < 2) {
+            return "0" + val;
+        }
+        return _hex;
+    };
+    _hexstr = ""
+    arr.forEach((val) => {_hexstr += toHex(val)});
+    return _hexstr
+};
+
+
+var computeFileChecksum = (file) => {
+    return readBinaryFile(file)
+        .then((content) => {
+            return window.crypto.subtle.digest(
+                "SHA-256", new Uint8Array(content));
+        }).then((digest) => {
+            return Uint8ArrayToHex(new Uint8Array(digest))
+        });
+};
+
+
+var defaultResumableHandler = (event) => {
+    throw new Error("Please provide a valid event handler!");
+};
+
+var addHandler = (resumable, handlername, handler) => {
+    if(resumable.support) {
+        resumable.on(handlername, (handler || defaultResumableHandler));
+    }
+    return resumable;
+};
+
+
+var makeResumableHandler = (handlername) => {
+    return (resumable, handler) => {
+        return addHandler(resumable, handlername, handler);
+    };
+};
+
+
+var fileSuccessHandler = makeResumableHandler("fileSuccess");
+var fileProgressHandler = makeResumableHandler("fileProgress");
+var fileAddedHandler = makeResumableHandler("fileAdded");
+var filesAddedHandler = makeResumableHandler("filesAdded");
+var filesRetryHandler = makeResumableHandler("filesRetry");
+var filesErrorHandler = makeResumableHandler("filesError");
+var uploadStartHandler = makeResumableHandler("uploadStart");
+var completeHandler = makeResumableHandler("complete");
+var progressHandler = makeResumableHandler("progress");
+var errorHandler = makeResumableHandler("error");
+
+
+var markResumableDragAndDropElement = (resumable, fileinput, droparea, browsebutton) => {
+    if(resumable.support) {
+        //Hide file input element and display drag&drop UI
+        add_class(fileinput, "hidden");
+        remove_class(droparea, "hidden");
+
+        // Define UI elements for browse and drag&drop
+        resumable.assignDrop(droparea);
+        resumable.assignBrowse(browsebutton);
+    }
+
+    return resumable;
+};
+
+
+var makeResumableElement = (targeturi, fileinput, droparea, uploadbutton, filetype) => {
+    var resumable = Resumable({
+        target: targeturi,
+        fileType: filetype,
+        maxFiles: 1,
+        forceChunkSize: true,
+        generateUniqueIdentifier: (file, event) => {
+            return computeFileChecksum(file).then((checksum) => {
+                var _relativePath = (file.webkitRelativePath
+                                     || file.relativePath
+                                     || file.fileName
+                                     || file.name);
+                return checksum + "-" + _relativePath.replace(
+                    /[^a-zA-Z0-9_-]/img, "");
+            });
+        }
+    });
+
+    return resumable;
+};