You've already forked DataMate
fix: 修复流式分割上传的"预上传请求不存在"错误
问题:handleStreamUpload 中为所有文件只调用一次 preUpload,设置
totalFileNum: files.length(原始文件数),但实际上传的文件数量
是按行分割后的总行数,导致后端提前删除预上传请求。
修复:将 preUpload 调用移到文件循环内部,为每个原始文件单独调用
preUpload,设置 totalFileNum: 1,每个文件有自己的 reqId。
这样可以避免按行分割导致的请求被提前删除问题。
修改文件:frontend/src/hooks/useSliceUpload.tsx
This commit is contained in:
@@ -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, {
|
||||
|
||||
Reference in New Issue
Block a user