浏览代码

Feat: add partition of file uploads (#5248)

### What problem does this PR solve?

Partitions the upload of documents in parts of 20 to avoid the size
limit error. Allows uploading 100s of documents on a single interaction.

### Type of change

- [X] New Feature (non-breaking change which adds functionality)
tags/v0.17.0
Omar Leonardo Sanchez Granados 8 个月前
父节点
当前提交
3d605a23fe
没有帐户链接到提交者的电子邮件
共有 1 个文件被更改,包括 50 次插入17 次删除
  1. 50
    17
      web/src/hooks/document-hooks.ts

+ 50
- 17
web/src/hooks/document-hooks.ts 查看文件

@@ -248,27 +248,60 @@ export const useUploadNextDocument = () => {
} = useMutation({
mutationKey: ['uploadDocument'],
mutationFn: async (fileList: UploadFile[]) => {
const formData = new FormData();
formData.append('kb_id', knowledgeId);
fileList.forEach((file: any) => {
formData.append('file', file);
});
const partitionedFileList = fileList.reduce<UploadFile[][]>(
(acc, cur, index) => {
const partIndex = Math.floor(index / 20); // Uploads 20 documents at a time
if (!acc[partIndex]) {
acc[partIndex] = [];
}
acc[partIndex].push(cur);
return acc;
},
[],
);

let allRet = [];
for (const listPart of partitionedFileList) {
const formData = new FormData();
formData.append('kb_id', knowledgeId);
listPart.forEach((file: any) => {
formData.append('file', file);
});

try {
const ret = await kbService.document_upload(formData);
const code = get(ret, 'data.code');
if (code === 0) {
message.success(i18n.t('message.uploaded'));
}
try {
const ret = await kbService.document_upload(formData);
allRet.push(ret);
} catch (error) {
allRet.push({ data: { code: 500 } });

if (code === 0 || code === 500) {
queryClient.invalidateQueries({ queryKey: ['fetchDocumentList'] });
const filenames = listPart.map((file: any) => file.name).join(', ');
console.warn(error);
console.warn('Error uploading files:', filenames);
}
return ret?.data;
} catch (error) {
console.warn(error);
return {};
}

const succeed = allRet.every((ret) => get(ret, 'data.code') === 0);
const any500 = allRet.some((ret) => get(ret, 'data.code') === 500);

if (succeed) {
message.success(i18n.t('message.uploaded'));
}

if (succeed || any500) {
queryClient.invalidateQueries({ queryKey: ['fetchDocumentList'] });
}

const allData = {
code: any500
? 500
: succeed
? 0
: allRet.filter((ret) => get(ret, 'data.code') !== 0)[0]?.data
?.code,
data: succeed,
message: allRet.map((ret) => get(ret, 'data.message')).join('/n'),
};
return allData;
},
});


正在加载...
取消
保存