前端: 添加文件上传弹窗组件
This commit is contained in:
parent
9ee28f404f
commit
2192c8d636
91
frontend/src/renderer/components/UploadModal.jsx
Normal file
91
frontend/src/renderer/components/UploadModal.jsx
Normal file
@ -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 (
|
||||||
|
<Modal
|
||||||
|
title="上传文件"
|
||||||
|
open={visible}
|
||||||
|
onCancel={onClose}
|
||||||
|
footer={null}
|
||||||
|
width={500}
|
||||||
|
>
|
||||||
|
<Dragger
|
||||||
|
name="file"
|
||||||
|
multiple={true}
|
||||||
|
customRequest={handleUpload}
|
||||||
|
fileList={fileList}
|
||||||
|
onChange={({ fileList }) => setFileList(fileList)}
|
||||||
|
disabled={uploading}
|
||||||
|
>
|
||||||
|
<p className="ant-upload-drag-icon">
|
||||||
|
<InboxOutlined />
|
||||||
|
</p>
|
||||||
|
<p className="ant-upload-text">点击或拖拽文件到此区域上传</p>
|
||||||
|
<p className="ant-upload-hint">
|
||||||
|
支持单个或批量上传,严禁上传恶意文件
|
||||||
|
</p>
|
||||||
|
</Dragger>
|
||||||
|
|
||||||
|
{uploading && (
|
||||||
|
<Progress percent={progress} status="active" style={{ marginTop: '16px' }} />
|
||||||
|
)}
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default UploadModal;
|
||||||
Loading…
Reference in New Issue
Block a user