|
@@ -0,0 +1,103 @@
|
|
|
+import consts from '@/utils/consts'
|
|
|
+import { InboxOutlined } from '@ant-design/icons'
|
|
|
+import { message, Modal, Upload } from 'antd'
|
|
|
+import { ModalProps } from 'antd/lib/modal'
|
|
|
+import { UploadChangeParam } from 'antd/lib/upload'
|
|
|
+import { UploadFile } from 'antd/lib/upload/interface'
|
|
|
+import React, { useState } from 'react'
|
|
|
+import { getSignature } from './ali-oss'
|
|
|
+interface iOSSData {
|
|
|
+ dir: string;
|
|
|
+ expire: string;
|
|
|
+ host: string;
|
|
|
+ accessId: string;
|
|
|
+ policy: string;
|
|
|
+ signature: string;
|
|
|
+}
|
|
|
+// interface iUploadModalProps {
|
|
|
+// onFileChange: () => void
|
|
|
+// modalProps: ModalProps
|
|
|
+// }
|
|
|
+const UploadModal:React.FC<ModalProps> = (props) => {
|
|
|
+ const [ OSSData, setOssData ] = useState<iOSSData>({
|
|
|
+ dir: '',
|
|
|
+ expire: '',
|
|
|
+ host: '',
|
|
|
+ accessId: '',
|
|
|
+ policy: '',
|
|
|
+ signature: ''
|
|
|
+ })
|
|
|
+ const { Dragger } = Upload
|
|
|
+ // 上传文件改变时的状态
|
|
|
+ const onChange = (info: UploadChangeParam) => {
|
|
|
+ const { status } = info.file
|
|
|
+ if (status !== 'uploading') {
|
|
|
+ console.log(info.file, info.fileList)
|
|
|
+ }
|
|
|
+ if (status === 'done') {
|
|
|
+ message.success(`${info.file.name} file uploaded successfully.`)
|
|
|
+ } else if (status === 'error') {
|
|
|
+ message.error(`${info.file.name} file upload failed.`)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 初始化、获取签名
|
|
|
+ const initOssData = async () => {
|
|
|
+ try {
|
|
|
+ const { code = -1, data = {} } = await getSignature()
|
|
|
+ if (code === consts.RET_CODE.SUCCESS) {
|
|
|
+ setOssData({ ...OSSData, ...data })
|
|
|
+ } else {
|
|
|
+ message.error("获取签名失败,请联系管理员!")
|
|
|
+
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ message.error(error)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 额外参数、oss签名
|
|
|
+ const getExtraData = (file: UploadFile) => {
|
|
|
+ return {
|
|
|
+ key: file.url,
|
|
|
+ OSSAccessKeyId: OSSData.accessId,
|
|
|
+ policy: OSSData.policy,
|
|
|
+ Signature: OSSData.signature
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const transformFile = (file: any) => {
|
|
|
+ file.url = OSSData.dir + file.name
|
|
|
+ return file
|
|
|
+ }
|
|
|
+ // 上传前的回调
|
|
|
+ const beforeUpload = () => {
|
|
|
+ const expire = parseInt(OSSData.expire) * 1000
|
|
|
+ if (expire < Date.now()) {
|
|
|
+ initOssData()
|
|
|
+ }
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ return (
|
|
|
+ <Modal {...props}>
|
|
|
+ <Dragger
|
|
|
+ name="file"
|
|
|
+ action={OSSData.host}
|
|
|
+ multiple={true}
|
|
|
+ onChange={onChange}
|
|
|
+ beforeUpload={beforeUpload}
|
|
|
+ data={getExtraData}
|
|
|
+ transformFile={transformFile}
|
|
|
+ >
|
|
|
+ <p className="ant-upload-drag-icon">
|
|
|
+ <InboxOutlined />
|
|
|
+ </p>
|
|
|
+ <p className="ant-upload-text">请点击或者拖动文件至此区域进行上传</p>
|
|
|
+ <p className="ant-upload-hint">
|
|
|
+ 支持单文件/多文件上传。附件大小最大为30MB!
|
|
|
+ </p>
|
|
|
+ </Dragger>
|
|
|
+ </Modal>
|
|
|
+ )
|
|
|
+}
|
|
|
+
|
|
|
+export default UploadModal
|