Mercurial > hg > orthanc
changeset 3067:e4f146b7d2d9 update-jquery
added an upload.html in pure HTML/JS (no dependencies)
author | amazy |
---|---|
date | Thu, 27 Dec 2018 15:26:27 +0100 |
parents | 5713952f60c0 |
children | |
files | .hgignore OrthancExplorer/upload.html |
diffstat | 2 files changed, 173 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/.hgignore Wed Dec 26 16:58:21 2018 +0100 +++ b/.hgignore Thu Dec 27 15:26:27 2018 +0100 @@ -3,3 +3,5 @@ CMakeLists.txt.user *.cpp.orig *.h.orig +build/ +.vscode/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OrthancExplorer/upload.html Thu Dec 27 15:26:27 2018 +0100 @@ -0,0 +1,171 @@ +<!DOCTYPE html> + +<html> + +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>Orthanc Explorer Upload page</title> + <style> + #file-catcher { + width: 100%; + height: 100%; + } + + .no-files { + border: 5px dashed #555; + } + + .files-over { + border: 5px dashed #55B; + } + + .files-ready { + border: 5px dashed green; + } + + .files-uploading { + border: 5px dashed orange; + } + </style> + +</head> + +<body> + + <form id='file-catcher' class="no-files"> + <p>Drag one or more files to this Drop zone ...</p> + <input id='file-input' type='file' multiple /> + <button type='submit'> + Submit + </button> + </form> + + <div id='file-list-display'></div> +</body> +<script> + (function () { + var fileCatcher = document.getElementById('file-catcher'); + var fileInput = document.getElementById('file-input'); + var fileListDisplay = document.getElementById('file-list-display'); + var maxConcurrentUploads = 4; + var currentUploadCount = 0; + + var fileList = []; + var renderFileList, sendFile; + + removeDragData = function (ev) { + console.log('Removing drag data'); + + if (ev.dataTransfer.items) { + // Use DataTransferItemList interface to remove the drag data + ev.dataTransfer.items.clear(); + } else { + // Use DataTransfer interface to remove the drag data + ev.dataTransfer.clearData(); + } + } + + renderFileList = function () { + fileListDisplay.innerHTML = ''; + fileList.forEach(function (file, index) { + let fileDisplayEl = document.createElement('p'); + fileDisplayEl.innerHTML = (index + 1) + ': ' + file.name; + fileListDisplay.appendChild(fileDisplayEl); + }); + }; + + sendFile = function (file) { + if (currentUploadCount >= maxConcurrentUploads) { // retry later + setTimeout(function() {sendFile(file);}, 1); + } else { + currentUploadCount++; + let formData = new FormData(); + let request = new XMLHttpRequest(); + + formData.set('file', file); + request.open("POST", '/instances'); + request.onreadystatechange = function() { // Call a function when the state changes. + if (this.readyState === XMLHttpRequest.DONE && this.status === 200) { + // Request finished. Do processing here. + currentUploadCount--; + } else if (this.readyState === XMLHttpRequest.DONE && this.status !== 200) { + console.log("failed", this); + currentUploadCount--; + } + } + request.send(formData); + } + }; + + setFileCatchClass = function (style) { + fileCatcher.classList.remove("no-files"); + fileCatcher.classList.remove("files-over"); + fileCatcher.classList.remove("files-ready"); + fileCatcher.classList.remove("files-uploading"); + + fileCatcher.classList.add(style); + }; + + fileCatcher.addEventListener('submit', function (evnt) { + evnt.preventDefault(); + setFileCatchClass("files-uploading"); + fileList.forEach(function (file) { + sendFile(file); + }); + fileList = []; + renderFileList(); + setFileCatchClass("no-files"); + }); + + fileCatcher.addEventListener('drop', function (e) { + console.log('File(s) dropped in zone', e); + e.preventDefault(); + + if (e.dataTransfer.items) { + // Use DataTransferItemList interface to access the file(s) + for (var i = 0; i < e.dataTransfer.items.length; i++) { + // If dropped items aren't files, reject them + if (e.dataTransfer.items[i].kind === 'file') { + var file = e.dataTransfer.items[i].getAsFile(); + fileList.push(file); + console.log('... file[' + i + '].name = ' + file.name); + } + } + } else { + // Use DataTransfer interface to access the file(s) + for (var i = 0; i < e.dataTransfer.files.length; i++) { + fileList.push(file); + console.log('... file[' + i + '].name = ' + e.dataTransfer.files[i].name); + } + } + + renderFileList(); + // Pass event to removeDragData for cleanup + removeDragData(e); + setFileCatchClass("files-ready"); + }); + + fileCatcher.addEventListener('dragover', function (e) { + console.log('File(s) in drop zone', e); + + // Prevent default behavior (Prevent file from being opened) + e.preventDefault(); + setFileCatchClass("files-over"); + }); + + fileInput.addEventListener('change', function (evnt) { + fileList = []; + for (var i = 0; i < fileInput.files.length; i++) { + fileList.push(fileInput.files[i]); + } + renderFileList(); + if (fileList.length > 0) { + setFileCatchClass("files-ready"); + } + }); + + })(); +</script> + +</html> \ No newline at end of file