document.addEventListener("dragover", function (event) { event.preventDefault(); }); document.addEventListener("drop", async function (event) { event.preventDefault(); const file = event.dataTransfer.files[0] await handleFile(file) }); document.getElementById('dropzone-file').addEventListener('change', async function(event) { event.preventDefault(); const file = event.target.files[0] await handleFile(file) }); async function handleFile(file){ const chunkSize = 2 * 1024 * 1024; const chunks = Math.ceil(file.size / chunkSize); const data = JSON.stringify({ "name": file.name, "size": file.size, "chunk": chunks, }); fetch('/upload/init', { method: 'POST', body: data, }).then(async response => { const responseData = await response.json() console.log(responseData) if (responseData.Done === false) { addNewUploadElement(file) const fileChunks = await splitFile(file, chunkSize); await uploadChunks(file.name,file.size, fileChunks, responseData.Uploaded, responseData.FileID); } else { alert("file already uploaded") } }).catch(error => { console.error('Error uploading file:', error); }); } function addNewUploadElement(file){ const newDiv = document.createElement('div'); newDiv.innerHTML = `

${ file.name }

${ convertFileSize(file.size) }

Starting...
Uploading 0%
`; document.getElementById('container').appendChild(newDiv); } function convertFileSize(sizeInBytes) { if (sizeInBytes < 1024) { return sizeInBytes + ' B'; } else if (sizeInBytes < 1024 * 1024) { return (sizeInBytes / 1024).toFixed(2) + ' KB'; } else if (sizeInBytes < 1024 * 1024 * 1024) { return (sizeInBytes / (1024 * 1024)).toFixed(2) + ' MB'; } else { return (sizeInBytes / (1024 * 1024 * 1024)).toFixed(2) + ' GB'; } } async function splitFile(file, chunkSize) { const fileSize = file.size; const chunks = Math.ceil(fileSize / chunkSize); const fileChunks = []; for (let i = 0; i < chunks; i++) { const start = i * chunkSize; const end = Math.min(fileSize, start + chunkSize); const chunk = file.slice(start, end); fileChunks.push(chunk); } return fileChunks; } async function uploadChunks(name, size, chunks, uploadedChunk= -1, FileID) { let byteUploaded = 0 var progress1 = document.getElementById(`progress-${name}-1`); var progress2 = document.getElementById(`progress-${name}-2`); var progress3 = document.getElementById(`progress-${name}-3`); var progress4 = document.getElementById(`progress-${name}-4`); for (let index = 0; index < chunks.length; index++) { const percentComplete = Math.round((index + 1) / chunks.length * 100); const chunk = chunks[index]; if (!(index <= uploadedChunk)) { const formData = new FormData(); formData.append('name', name); formData.append('chunk', chunk); formData.append('index', index); formData.append('done', false); progress1.setAttribute("aria-valuenow", percentComplete); progress2.style.width = `${percentComplete}%`; const startTime = performance.now(); await fetch(`/upload/${FileID}`, { method: 'POST', body: formData }); const endTime = performance.now(); const totalTime = (endTime - startTime) / 1000; const uploadSpeed = chunk.size / totalTime / 1024 / 1024; byteUploaded += chunk.size progress3.innerText = `${uploadSpeed.toFixed(2)} MB/s`; progress4.innerText = `Uploading ${percentComplete}% - ${convertFileSize(byteUploaded)} of ${ convertFileSize(size)}`; } else { progress1.setAttribute("aria-valuenow", percentComplete); progress2.style.width = `${percentComplete}%`; byteUploaded += chunk.size } } const formData = new FormData(); formData.append('name', name); formData.append('done', true); return fetch(`/upload/${FileID}`, { method: 'POST', body: formData }); }