|
|
@@ -12,6 +12,7 @@ import router from '@/router';
|
|
|
import { Record, RecordKonwledge } from './types';
|
|
|
import dayjs from 'dayjs';
|
|
|
import { set } from 'mobx';
|
|
|
+import axios from 'axios';
|
|
|
|
|
|
const { Dragger } = Upload;
|
|
|
|
|
|
@@ -47,50 +48,93 @@ const KnowledgeLibInfo: React.FC = () => {
|
|
|
|
|
|
const params = useParams();
|
|
|
|
|
|
+ const [fileList, setFileList] = React.useState<any[]>([]);
|
|
|
+ const [uploading, setUploading] = React.useState(false);
|
|
|
+
|
|
|
const props: UploadProps = {
|
|
|
name: 'file',
|
|
|
multiple: true,
|
|
|
- action: '/api/deepseek/api/uploadDocument/' + params.knowledgeId,
|
|
|
+ accept: '.md,.txt,.pdf,.jpg,.png,.jpeg,.docx,.xlsx,.pptx,.eml,.csv,.tar,.gz,.bz2,.zip,.rar,.jar',
|
|
|
+ fileList: fileList,
|
|
|
+ //action: '/api/deepseek/api/uploadDocument/' + params.knowledgeId,
|
|
|
|
|
|
- beforeUpload(file, fileList) {
|
|
|
- setUploadLoading(true);
|
|
|
- // 自定义上传逻辑
|
|
|
- if (fileList.length > 1) {
|
|
|
- setUploadLoading(false);
|
|
|
- message.error('一次只能上传一个文件');
|
|
|
- return false;
|
|
|
- }
|
|
|
- if (file.name.split('.').pop() !== 'pdf') {
|
|
|
- setUploadLoading(false);
|
|
|
- message.error('仅支持上传pdf文档');
|
|
|
- return false;
|
|
|
- }
|
|
|
- },
|
|
|
- onChange(info) {
|
|
|
- const { status } = info.file;
|
|
|
+ beforeUpload: (file, files) => {
|
|
|
+ const allowedExtensions = ['md', 'txt', 'pdf', 'jpg', 'png', 'jpeg', 'docx', 'xlsx', 'pptx', 'eml', 'csv', 'tar', 'gz', 'bz2', 'zip', 'rar', 'jar'];
|
|
|
|
|
|
- if (status !== 'uploading') {
|
|
|
- console.log(status, 'status--uploading');
|
|
|
+ // 检查文件类型
|
|
|
+ for (const file of files) {
|
|
|
+ const fileExt = file.name.split('.').pop()?.toLowerCase();
|
|
|
+ if (!fileExt || !allowedExtensions.includes(fileExt)) {
|
|
|
+ message.error(`不支持 ${fileExt} 格式的文件上传`);
|
|
|
+ return Upload.LIST_IGNORE;
|
|
|
+ }
|
|
|
}
|
|
|
- if (status === 'done') {
|
|
|
- console.log(status, 'status--done');
|
|
|
- console.info(info.file.response, 'info.file.response.data');
|
|
|
- if (info.file.response.code === 200 && info.file.response.data === 1) {
|
|
|
- message.success(`${info.file.name} file uploaded successfully.`);
|
|
|
- init(params.knowledgeId);
|
|
|
+
|
|
|
+ // 检查文件大小
|
|
|
+ let totalSize = 0;
|
|
|
+ for (const file of files) {
|
|
|
+ const fileExt = file.name.split('.').pop()?.toLowerCase();
|
|
|
+ const fileSizeMB = file.size / 1024 / 1024;
|
|
|
+
|
|
|
+ if (fileSizeMB > 30) {
|
|
|
+ message.error('单个文件不能大于30M');
|
|
|
+ return Upload.LIST_IGNORE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (['jpg', 'png', 'jpeg'].includes(fileExt!) && fileSizeMB > 5) {
|
|
|
+ message.error('单张图片不能大于5M');
|
|
|
+ return Upload.LIST_IGNORE;
|
|
|
}
|
|
|
- setUploadLoading(false);
|
|
|
- } else if (status === 'error') {
|
|
|
- console.log(status, 'status--error');
|
|
|
- message.error(`${info.file.name} file upload failed.`);
|
|
|
- setUploadLoading(false);
|
|
|
+
|
|
|
+ totalSize += fileSizeMB;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (totalSize > 125) {
|
|
|
+ message.error('文件总大小超过125M');
|
|
|
+ return Upload.LIST_IGNORE;
|
|
|
}
|
|
|
+
|
|
|
+ return false;
|
|
|
+ },
|
|
|
+
|
|
|
+ onChange: async ({ fileList }) => {
|
|
|
+ setFileList(fileList);
|
|
|
+ },
|
|
|
+ onRemove: (file) => {
|
|
|
+ setFileList(prev => prev.filter(item => item.uid !== file.uid));
|
|
|
},
|
|
|
onDrop(e) {
|
|
|
console.log('Dropped files', e.dataTransfer.files);
|
|
|
},
|
|
|
};
|
|
|
|
|
|
+ const handleUpload = async () => {
|
|
|
+ if (fileList.length === 0) return;
|
|
|
+
|
|
|
+ setUploading(true);
|
|
|
+ const formData = new FormData();
|
|
|
+
|
|
|
+ // 添加所有文件
|
|
|
+ fileList.forEach(file => {
|
|
|
+ if (file.originFileObj) {
|
|
|
+ formData.append('files', file.originFileObj);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ try {
|
|
|
+ const res = await axios.post('/api/deepseek/api/uploadDocument/' + params.knowledgeId, formData, {
|
|
|
+ headers: { 'Content-Type': 'multipart/form-data' }
|
|
|
+ });
|
|
|
+
|
|
|
+ message.success(`${fileList.length}个文件上传成功`);
|
|
|
+ setFileList([]);
|
|
|
+ } catch (err) {
|
|
|
+ message.error('上传失败');
|
|
|
+ } finally {
|
|
|
+ setUploading(false);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
React.useEffect(() => {
|
|
|
init(params.knowledgeId);
|
|
|
return () => reset();
|
|
|
@@ -249,7 +293,9 @@ const KnowledgeLibInfo: React.FC = () => {
|
|
|
点击上传,或拖放文件到此处
|
|
|
</p >
|
|
|
<p className="ant-upload-hint">
|
|
|
- 仅支持上传pdf文档,文档大小不超过50M.
|
|
|
+ 支持文件格式md,txt,pdf,jpg,png,jpeg,docx,xlsx,
|
|
|
+ pptx,eml,csv,单个文档小雨30M,单张图片小于5M,文件总
|
|
|
+ 大小不得超过125M.
|
|
|
</p>
|
|
|
</Dragger>
|
|
|
</div>
|
|
|
@@ -261,7 +307,7 @@ const KnowledgeLibInfo: React.FC = () => {
|
|
|
<>
|
|
|
<div>
|
|
|
<Upload {...props}>
|
|
|
- <Button type='primary' icon={<PlusOutlined />}>上传知识文件</Button>
|
|
|
+ <Button type='primary' icon={<PlusOutlined />} onClick={handleUpload} disabled={uploading}>上传知识文件</Button>
|
|
|
</Upload>
|
|
|
</div>
|
|
|
|