From 3af1daf8b66fa8a5d0c705dfe7c6fc131212dea0 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Wed, 4 Feb 2026 15:39:05 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=B5=81=E5=BC=8F?= =?UTF-8?q?=E5=88=86=E5=89=B2=E4=B8=8A=E4=BC=A0=E7=9A=84"=E9=A2=84?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E8=AF=B7=E6=B1=82=E4=B8=8D=E5=AD=98=E5=9C=A8?= =?UTF-8?q?"=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题:handleStreamUpload 中为所有文件只调用一次 preUpload,设置 totalFileNum: files.length(原始文件数),但实际上传的文件数量 是按行分割后的总行数,导致后端提前删除预上传请求。 修复:将 preUpload 调用移到文件循环内部,为每个原始文件单独调用 preUpload,设置 totalFileNum: 1,每个文件有自己的 reqId。 这样可以避免按行分割导致的请求被提前删除问题。 修改文件:frontend/src/hooks/useSliceUpload.tsx --- frontend/src/hooks/useSliceUpload.tsx | 32 ++++++++++++++++----------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/frontend/src/hooks/useSliceUpload.tsx b/frontend/src/hooks/useSliceUpload.tsx index 1fcc62e..6fe76b0 100644 --- a/frontend/src/hooks/useSliceUpload.tsx +++ b/frontend/src/hooks/useSliceUpload.tsx @@ -218,26 +218,20 @@ export function useFileSliceUpload( try { console.log('[useSliceUpload] Starting stream upload for', files.length, 'files'); - // 预上传,获取 reqId const totalSize = files.reduce((acc, file) => acc + file.size, 0); - const { data: reqId } = await preUpload(task.key, { - totalFileNum: files.length, - totalSize, - datasetId: task.key, - hasArchive: task.hasArchive, - prefix: task.prefix, - }); - console.log('[useSliceUpload] Stream upload preUpload response reqId:', reqId); - + // 存储所有文件的 reqId,用于取消上传 + const reqIds: number[] = []; + const newTask: TaskItem = { ...task, - reqId, + reqId: -1, isCancel: false, cancelFn: () => { // 使用 newTask 的 controller 确保一致性 newTask.controller.abort(); - cancelUpload?.(reqId); + // 取消所有文件的预上传请求 + reqIds.forEach(id => cancelUpload?.(id)); if (newTask.updateEvent) window.dispatchEvent(new Event(newTask.updateEvent)); }, }; @@ -247,7 +241,7 @@ export function useFileSliceUpload( let totalProcessedBytes = 0; const results: StreamUploadResult[] = []; - // 逐个处理文件 + // 逐个处理文件,每个文件单独调用 preUpload for (let i = 0; i < files.length; i++) { // 检查是否已取消 if (newTask.controller.signal.aborted) { @@ -257,6 +251,18 @@ export function useFileSliceUpload( const file = files[i]; console.log(`[useSliceUpload] Processing file ${i + 1}/${files.length}: ${file.name}`); + // 为每个文件单独调用 preUpload,获取独立的 reqId + const { data: reqId } = await preUpload(task.key, { + totalFileNum: 1, + totalSize: file.size, + datasetId: task.key, + hasArchive: task.hasArchive, + prefix: task.prefix, + }); + + console.log(`[useSliceUpload] File ${file.name} preUpload response reqId:`, reqId); + reqIds.push(reqId); + const result = await streamSplitAndUpload( file, (formData, config) => uploadChunk(task.key, formData, {