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, {