diff --git a/frontend/src/renderer/components/UploadModal.jsx b/frontend/src/renderer/components/UploadModal.jsx new file mode 100644 index 0000000..c20d3cc --- /dev/null +++ b/frontend/src/renderer/components/UploadModal.jsx @@ -0,0 +1,91 @@ +import React, { useState } from 'react'; +import { Modal, Upload, Button, Progress, message } from 'antd'; +import { UploadOutlined, InboxOutlined } from '@ant-design/icons'; + +const { Dragger } = Upload; + +function UploadModal({ visible, onClose, onSuccess }) { + const [uploading, setUploading] = useState(false); + const [progress, setProgress] = useState(0); + const [fileList, setFileList] = useState([]); + + const handleUpload = async ({ file, onProgress }) => { + setUploading(true); + + const formData = new FormData(); + formData.append('file', file); + + try { + const token = localStorage.getItem('token'); + const xhr = new XMLHttpRequest(); + + xhr.upload.addEventListener('progress', (e) => { + if (e.lengthComputable) { + const percent = Math.round((e.loaded / e.total) * 100); + setProgress(percent); + onProgress({ percent }); + } + }); + + xhr.open('POST', '/api/files/upload'); + xhr.setRequestHeader('Authorization', `Bearer ${token}`); + + xhr.onload = () => { + if (xhr.status === 200) { + message.success('上传成功'); + onSuccess?.(); + setUploading(false); + setProgress(0); + setFileList([]); + onClose(); + } else { + message.error('上传失败'); + setUploading(false); + } + }; + + xhr.onerror = () => { + message.error('上传失败'); + setUploading(false); + }; + + xhr.send(formData); + } catch (error) { + message.error('上传失败: ' + error.message); + setUploading(false); + } + }; + + return ( + + setFileList(fileList)} + disabled={uploading} + > +

+ +

+

点击或拖拽文件到此区域上传

+

+ 支持单个或批量上传,严禁上传恶意文件 +

+
+ + {uploading && ( + + )} +
+ ); +} + +export default UploadModal;