|
@@ -1,6 +1,5 @@
|
|
|
import React, { PureComponent } from 'react';
|
|
|
-import PropTypes from 'prop-types';
|
|
|
-import { message, Upload, Icon, Modal } from 'antd';
|
|
|
+import { message, Tooltip, Upload, Icon, Modal } from 'antd';
|
|
|
import styles from './index.less';
|
|
|
import { getSignature } from '../../services/resource';
|
|
|
|
|
@@ -32,76 +31,85 @@ const renderAccept = (accept) => {
|
|
|
}
|
|
|
|
|
|
export default class Uploader extends PureComponent {
|
|
|
- static propTypes = {
|
|
|
- files: PropTypes.oneOfType([PropTypes.array, PropTypes.string]),
|
|
|
- onUpload: PropTypes.func.isRequired,
|
|
|
- multiple: PropTypes.oneOfType([PropTypes.bool, PropTypes.number]),
|
|
|
- disabled: PropTypes.bool,
|
|
|
- path: PropTypes.string,
|
|
|
- accept: PropTypes.string,
|
|
|
- };
|
|
|
-
|
|
|
constructor(props) {
|
|
|
super(props);
|
|
|
this.state = {
|
|
|
previewVisible: false,
|
|
|
previewImage: '',
|
|
|
- files: getFileList(props.files),
|
|
|
+ files: getFileList(props.fileUrl),
|
|
|
signature: {},
|
|
|
fileName: '',
|
|
|
+ completePath: '',
|
|
|
};
|
|
|
}
|
|
|
|
|
|
componentWillReceiveProps(nextProps) {
|
|
|
- // // 当前属性中的文件对象是一个列表并且接受到的属性中files不为空
|
|
|
- // if (Array.isArray(this.props.files) && !this.props.files.length && !!nextProps.files.length) {
|
|
|
- // this.setState({ files: getFileList(nextProps.files) });
|
|
|
- // }
|
|
|
- this.setState({ files: getFileList(nextProps.files) });
|
|
|
+ this.setState({ files: getFileList(nextProps.fileUrl) });
|
|
|
+ }
|
|
|
+
|
|
|
+ genRandomFileName = (fileName, fileCode) => {
|
|
|
+ let relativePath = (fileCode || '').replace(/-/g, '/') + '/';
|
|
|
+ let separatorIndex = fileName.lastIndexOf('.');
|
|
|
+ let name = fileName.substring(0, separatorIndex);
|
|
|
+ let suffix = fileName.substring(separatorIndex + 1, fileName.length);
|
|
|
+ let ossFileName = ((new Date()).getTime()).toString() + Math.floor(Math.random() * 10000) + '.' + suffix;
|
|
|
+ return `${relativePath}${ossFileName}`;
|
|
|
}
|
|
|
|
|
|
render() {
|
|
|
- const { previewVisible, previewImage, files, signature, fileName } = this.state;
|
|
|
- const { multiple = 1, onUpload, disabled, path, accept } = this.props;
|
|
|
+ const {
|
|
|
+ files,
|
|
|
+ fileName,
|
|
|
+ signature,
|
|
|
+ completePath,
|
|
|
+ previewImage,
|
|
|
+ previewVisible,
|
|
|
+ } = this.state;
|
|
|
+ const { accept, fileCode, onUpload, multiple = 1 } = this.props;
|
|
|
|
|
|
- // 根据单图/多图上传模式来选择返回一个还是多个文件对象
|
|
|
const renderFiles = (fileList) => {
|
|
|
const newFiles = fileList.map(file => {
|
|
|
return file.response ? file.response.data.file : file;
|
|
|
});
|
|
|
- if (multiple === 1) {
|
|
|
- return newFiles[0];
|
|
|
- }
|
|
|
- return newFiles;
|
|
|
+ return newFiles[0];
|
|
|
}
|
|
|
|
|
|
+ //upload上传参数配置
|
|
|
const uploadProps = {
|
|
|
accept: renderAccept(accept),
|
|
|
action: signature.host,
|
|
|
headers: {
|
|
|
- 'Authorization': `OSS${signature.accessid}:${signature.signature}`,
|
|
|
+ 'Authorization': `OSS ${signature.accessid}:${signature.signature}`,
|
|
|
},
|
|
|
data: {
|
|
|
policy: signature.policy,
|
|
|
signature: signature.signature,
|
|
|
OSSAccessKeyId: signature.accessid,
|
|
|
- key: `${signature.dir}${fileName}`,
|
|
|
+ key: `${signature.dir}${completePath}`,
|
|
|
success_action_status: '200',
|
|
|
},
|
|
|
- disabled,
|
|
|
listType: 'picture-card',
|
|
|
fileList: files,
|
|
|
- multiple: multiple === true,
|
|
|
+ disabled: fileCode ? false : true,
|
|
|
+ multiple: multiple ? true : false,
|
|
|
onPreview: (file) => {
|
|
|
- this.setState({ previewImage: file.url || file.thumbUrl, previewVisible: true });
|
|
|
- },
|
|
|
- beforeUpload: (file, fileList) => {
|
|
|
- // 根据图片名称,转换成路径地址
|
|
|
this.setState({
|
|
|
- fileName: file.name.replace(/-/g, '/')
|
|
|
+ previewImage: file.url || file.thumbUrl,
|
|
|
+ previewVisible: true,
|
|
|
});
|
|
|
+ },
|
|
|
+ beforeUpload: (file, fileList) => {
|
|
|
// 进行签名校验,失效则刷新签名
|
|
|
- return getSignature({ fileName: file.name }).then(res => this.setState({signature: { ...res.data }}));
|
|
|
+ return getSignature({ fileName: file.name })
|
|
|
+ .then(res =>
|
|
|
+ this.setState({
|
|
|
+ signature: {
|
|
|
+ ...res.data,
|
|
|
+ },
|
|
|
+ fileName: file.name,
|
|
|
+ completePath: this.genRandomFileName(file.name, fileCode),
|
|
|
+ })
|
|
|
+ );
|
|
|
},
|
|
|
onChange: ({ file, fileList }) => {
|
|
|
// 检查图片大小,不能超过5M
|
|
@@ -113,16 +121,12 @@ export default class Uploader extends PureComponent {
|
|
|
this.setState({ files: fileList });
|
|
|
// 检查上传过程中图片的状态,上传成功回传fileName, signature, file
|
|
|
if (file.percent === 100 && file.status === 'done') {
|
|
|
- onUpload(renderFiles(fileList, 1), fileName, signature);
|
|
|
+ onUpload(renderFiles(fileList, 1), completePath, signature);
|
|
|
} else if (file.status === 'error') {
|
|
|
message.error('图片上传失败!');
|
|
|
- // this.setState({ files: [] });
|
|
|
}
|
|
|
},
|
|
|
onRemove: (file) => {
|
|
|
- if (disabled) {
|
|
|
- return false;
|
|
|
- }
|
|
|
const fileList = this.state.files.filter(item => item.uid !== file.uid);
|
|
|
onUpload(renderFiles(fileList, 0), fileName, signature);
|
|
|
return true;
|
|
@@ -144,12 +148,25 @@ export default class Uploader extends PureComponent {
|
|
|
|
|
|
return (
|
|
|
<div>
|
|
|
- <Upload {...uploadProps}>
|
|
|
- {multiple === true ? uploadButton : (files.length < multiple && uploadButton)}
|
|
|
- </Upload>
|
|
|
- <Modal {...modalProps}>
|
|
|
- <img className={styles.previewImage} alt="" src={previewImage} />
|
|
|
- </Modal>
|
|
|
+ {fileCode ?
|
|
|
+ <div>
|
|
|
+ <Upload {...uploadProps}>
|
|
|
+ {multiple === true ? uploadButton : (files.length < multiple && uploadButton)}
|
|
|
+ </Upload>
|
|
|
+ <Modal {...modalProps}>
|
|
|
+ <img className={styles.previewImage} alt="" src={previewImage} />
|
|
|
+ </Modal>
|
|
|
+ </div>
|
|
|
+ :
|
|
|
+ <Tooltip placement="top" title="请先指定编号和名称">
|
|
|
+ <Upload {...uploadProps}>
|
|
|
+ {multiple === true ? uploadButton : (files.length < multiple && uploadButton)}
|
|
|
+ </Upload>
|
|
|
+ <Modal {...modalProps}>
|
|
|
+ <img className={styles.previewImage} alt="" src={previewImage} />
|
|
|
+ </Modal>
|
|
|
+ </Tooltip>
|
|
|
+ }
|
|
|
</div>
|
|
|
);
|
|
|
}
|