diff --git a/src/pages/home/uploads/Upload.tsx b/src/pages/home/uploads/Upload.tsx index 8e5f00f2e..1712f9877 100644 --- a/src/pages/home/uploads/Upload.tsx +++ b/src/pages/home/uploads/Upload.tsx @@ -49,11 +49,14 @@ const UploadFile = (props: UploadFileProps) => { > {props.path} - - - {t(`home.upload.${props.status}`)} - - {getFileSize(props.speed)}/s + + + + {t(`home.upload.${props.status}`)} + + {getFileSize(props.speed)}/s + + {getFileSize(props.size)} { + const now = Date.now() + const timeDiff = (now - lastTime) / 1000 + + if (timeDiff >= throttleMs / 1000) { + const speed = (loaded - lastLoaded) / timeDiff + setUpload?.("speed", speed) + lastLoaded = loaded + lastTime = now + } + } +} + export const HttpDirectUpload: Upload = async ( uploadPath: string, file: File, @@ -39,8 +57,9 @@ export const HttpDirectUpload: Upload = async ( const uploadURL = uploadInfo.upload_url const method = uploadInfo.method || "PUT" - if (chunkSize > 0 && file.size > chunkSize) { - // Chunked upload + if (chunkSize > 0) { + // Always use chunked upload when chunkSize is provided + // This ensures Content-Range header is set for all files return await uploadChunked( file, uploadURL, @@ -50,7 +69,7 @@ export const HttpDirectUpload: Upload = async ( setUpload, ) } else { - // Single upload + // Single upload for drivers that don't support chunking return await uploadSingle( file, uploadURL, @@ -69,13 +88,14 @@ async function uploadSingle( setUpload?: SetUpload, ): Promise { const xhr = new XMLHttpRequest() + const calcSpeed = createSpeedCalculator() return new Promise((resolve, reject) => { xhr.upload.addEventListener("progress", (e) => { if (e.lengthComputable && setUpload) { const progress = (e.loaded / e.total) * 100 setUpload("progress", progress) - setUpload("speed", 0) // Speed calculation not implemented + calcSpeed(e.loaded, setUpload) } }) @@ -113,6 +133,7 @@ async function uploadChunked( setUpload?: SetUpload, ): Promise { const totalChunks = Math.ceil(file.size / chunkSize) + const calcSpeed = createSpeedCalculator() let uploadedBytes = 0 for (let i = 0; i < totalChunks; i++) { @@ -125,10 +146,10 @@ async function uploadChunked( await new Promise((resolve, reject) => { xhr.upload.addEventListener("progress", (e) => { if (e.lengthComputable && setUpload) { - const chunkProgress = uploadedBytes + e.loaded - const progress = (chunkProgress / file.size) * 100 + const totalLoaded = uploadedBytes + e.loaded + const progress = (totalLoaded / file.size) * 100 setUpload("progress", progress) - setUpload("speed", 0) // Speed calculation not implemented + calcSpeed(totalLoaded, setUpload) } })