antD上传图片Demo

2019-12-04  本文已影响0人  爱楚楚真是太好了
import React, { Component } from 'react';
import {
  Button,
  Form,
  Upload,
  Icon,
} from 'antd';

@Form.create()
class UploadDemo extends Component {
  constructor(props) {
    super(props);
    this.state = {

    };
  }

  /**
   * 重置imageList
   */
  restUpLoad = () => {
    const { form } = this.props;
    // 建议使用form.setFieldsValue()去置空, 使用form.resetFields()置空还会存在值
    form.setFieldsValue({
      "imageList": undefined,
    });
  };

  /**
   * 上传组件自定义校验
   */
  handleUploadListen = (rule, value, callback) => {
    let listLog = true;
    let newCode = "200";
    if (value && value.length > 0) {
      value.map((item) => {
        const { response = {} } = item;
        const { code } = response;
        if (item.status === "error") {
          listLog = false;
        }
        if (code && code !== "200") {
          newCode = code;
        }
        return null;
      });

      if (!listLog || newCode !== "200") {
        callback("上传错误,请重新上传!");
      } else {
        callback();
      }
    } else {
      callback();
    }
  };

  /**
   * 提交
   * @param {Object} e event
   */
  handleSubmit = e => {
    e.preventDefault();
    this.props.form.validateFieldsAndScroll((err, values) => {
      if (!err) {
        const newImageList = []; // 服务端文件名(传参)
        const { imageList } = values;
        if (imageList && imageList.length > 0) {
          imageList.map((item) => {
            const { response } = item;
            if (item.status !== "error" && response && response.code === "200") {
              newImageList.push(response.data);
            }
            return null;
          });
        }
      }
    });
  };
  
  /**
   * 使用getValueFromEvent可以把 onChange 的参数(如 event)转化为控件的值
   * @param {Array} e event
   */
  normFile = e => {
    if (Array.isArray(e)) {
      return e;
    }
    return e && e.fileList;
  };

  render () {
    const { form } = this.props;
    const { getFieldDecorator } = form;
    const formItemLayout = {
      labelCol: {
        xs: { span: 24 },
        sm: { span: 8 },
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 16 },
      },
    };
    const tailFormItemLayout = {
      wrapperCol: {
        xs: {
          span: 24,
          offset: 0,
        },
        sm: {
          span: 16,
          offset: 8,
        },
      },
    };
    return (
      <div>
        <Form {...formItemLayout} onSubmit={this.handleSubmit}>
          <Form.Item label="上传图片">
            {getFieldDecorator('imageList', {
              rules: [
                {
                  required: true,
                  message: '必填项',
                },
                {
                  validator: this.handleUploadListen, // 自定义校验
                },
              ],
              valuePropName: 'fileList',
              getValueFromEvent: this.normFile,
            })(
              <Upload
                accept=".png, .jpg, .jpeg" // 支持的文件类型
                action="/api/uploadImg" // 上传接口的url
                listType="picture"
                multiple
                name="file" // 发到后台的文件参数名
                method="get"
                data={{ // 额外传参
                  fileType: 0,
                }}
                directory //支持上传文件夹(支持后无法单独上传一张图片...)
              >
                <Button>
                  <Icon type="upload" />
                  上传图片
                </Button>
              </Upload>
            )}
          </Form.Item>
          <Form.Item {...tailFormItemLayout}>
            <Button type="primary" htmlType="submit">
              提交
            </Button>
          </Form.Item>
        </Form>
      </div>
    )
  }
}

export default UploadDemo;
上一篇下一篇

猜你喜欢

热点阅读