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 {
|
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, {
|
||||||
|
|||||||
Reference in New Issue
Block a user