fix: 修复流式分割上传的"预上传请求不存在"错误

问题:handleStreamUpload 中为所有文件只调用一次 preUpload,设置
      totalFileNum: files.length(原始文件数),但实际上传的文件数量
      是按行分割后的总行数,导致后端提前删除预上传请求。

修复:将 preUpload 调用移到文件循环内部,为每个原始文件单独调用
      preUpload,设置 totalFileNum: 1,每个文件有自己的 reqId。
      这样可以避免按行分割导致的请求被提前删除问题。

修改文件:frontend/src/hooks/useSliceUpload.tsx
This commit is contained in:
2026-02-04 15:39:05 +08:00
parent 7c7729434b
commit 3af1daf8b6

View File

@@ -218,26 +218,20 @@ export function useFileSliceUpload(
try { try {
console.log('[useSliceUpload] Starting stream upload for', files.length, 'files'); console.log('[useSliceUpload] Starting stream upload for', files.length, 'files');
// 预上传,获取 reqId
const totalSize = files.reduce((acc, file) => acc + file.size, 0); 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 = { const newTask: TaskItem = {
...task, ...task,
reqId, reqId: -1,
isCancel: false, isCancel: false,
cancelFn: () => { cancelFn: () => {
// 使用 newTask 的 controller 确保一致性 // 使用 newTask 的 controller 确保一致性
newTask.controller.abort(); newTask.controller.abort();
cancelUpload?.(reqId); // 取消所有文件的预上传请求
reqIds.forEach(id => cancelUpload?.(id));
if (newTask.updateEvent) window.dispatchEvent(new Event(newTask.updateEvent)); if (newTask.updateEvent) window.dispatchEvent(new Event(newTask.updateEvent));
}, },
}; };
@@ -247,7 +241,7 @@ export function useFileSliceUpload(
let totalProcessedBytes = 0; let totalProcessedBytes = 0;
const results: StreamUploadResult[] = []; const results: StreamUploadResult[] = [];
// 逐个处理文件 // 逐个处理文件,每个文件单独调用 preUpload
for (let i = 0; i < files.length; i++) { for (let i = 0; i < files.length; i++) {
// 检查是否已取消 // 检查是否已取消
if (newTask.controller.signal.aborted) { if (newTask.controller.signal.aborted) {
@@ -257,6 +251,18 @@ export function useFileSliceUpload(
const file = files[i]; const file = files[i];
console.log(`[useSliceUpload] Processing file ${i + 1}/${files.length}: ${file.name}`); 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( const result = await streamSplitAndUpload(
file, file,
(formData, config) => uploadChunk(task.key, formData, { (formData, config) => uploadChunk(task.key, formData, {