ImgUploadCom.jsx 3.0 KB
import React from 'react';
import { Upload, message, Badge, Icon } from 'antd';
import config from '@/webPublic/one_stop_public/config';
import { zipImage } from '@/webPublic/zyd_public/utils/handlePhoto';
import { getToken } from '@/webPublic/one_stop_public/utils/token';
import { queryFileUrl } from '@/webPublic/one_stop_public/utils/queryConfig';

export default class ImgUploadCom extends React.Component {
  constructor(props) {
    super(props);
    const value = props.value;
    this.state = {
      url: value,
    };
  }

  triggerChange = (changedValue) => {
    // Should provide an event to pass value to Form.
    const onChange = this.props.onChange;
    if (onChange) {
      onChange(changedValue);
    }
  };

  componentWillReceiveProps(nextProps) {
    // Should be a controlled component.
    if ('value' in nextProps) {
      const value = nextProps.value;
      this.setState({ url: value });
    }
  }

  changeUrl = (info, key) => {
    if (info.file.status === 'done') {
      message.success(`图片上传成功`);

      if (!('value' in this.props)) {
        this.setState({ url: info.file.response });
      }
      this.triggerChange(info.file.response);
    } else if (info.file.status === 'error') {
      message.error(`图片上传失败`);
    }
  };
  changePos = (obj) => {
    if (!('value' in this.props)) {
      this.setState({ ...obj });
    }
    this.triggerChange({ ...obj });
  };

  removePicture = (e) => {
    if (e && e.stopPropagation) {
      e.stopPropagation();
      e.preventDefault();
    }
    this.triggerChange('');
  };

  render() {
    const {
      json,
      disabled
    } = this.props;
    const { url } = this.state;
    return (
      <Upload.Dragger
        disabled={disabled}
        accept={'image/*'}
        url={url}
        headers={{
          Authorization: `bearer ${getToken()}`,
        }}
        data={{
          token: getToken(),
        }}
        beforeUpload={(file) => {
          return zipImage(file, 4);
          // 图片压缩函数. 超过fileSizeLimitMb兆的图片 直接压缩成原来的 30%  如果后续有其他需求考虑 做成全局配置项 配置可以压缩的图片的范围
          // 禅道bug 23185
        }}
        showUploadList={false}
        name="file"
        action={config.uploadUrl}
        onChange={this.changeUrl}
        multiple={false}
        style={{ padding: 0 }}>
        {url ? (
          <Badge count={<Icon type="close-circle"
                              style={{ color: 'red' }}
                              onClick={this.removePicture}
          />}>
            <img
              src={queryFileUrl(url)}
              style={{
                height: json.height,
                width: json.width,
                maxWidth: '60vw', // 解决图片在移动端过宽的bug
              }}
            />
          </Badge>
        ) : (
          <div
            style={{
              height: json.height,
              width: json.width,
            }}
          />
        )}
      </Upload.Dragger>
    );
  }
}