title: action function is required with antd upload control, but I dont need it
body: <p>I am using ant design components and I have an upload input:
  <a href="https://ant.design/components/upload/" rel="noreferrer">https://ant.design/components/upload/</a></p>
  
  <p>According to the documentation, action is required on the props.</p>
  
  <p>However I dont need the file to be posted to an url when uploaded, I need the entire FORM to be submited to a rest endpoint (check handlesubmit function)</p>
  
  <p>Trying to go through the documentation, I used the handlechange event to add the file to the state, but the STATUS is never done, so that line is never hit.</p>
  
  <p>What am I missing here?</p>
  
  <pre><code>import React, { Component } from 'react';
  import { Input, Upload , Icon, message} from 'antd';
  import Form from '../../components/uielements/form';
  import Checkbox from '../../components/uielements/checkbox';
  import Button from '../../components/uielements/button';
  import Notification from '../../components/notification';
  import { adalApiFetch } from '../../adalConfig';
  
  const FormItem = Form.Item;
  
  class RegisterTenantForm extends Component {
      constructor(props) {
          super(props);
          this.state = {TenantId: '', TenantUrl: '', CertificatePassword: '', confirmDirty: false, loading: false, buttondisabled: true};
          this.handleChangeTenantUrl = this.handleChangeTenantUrl.bind(this);
          this.handleChangeCertificatePassword = this.handleChangeCertificatePassword.bind(this);
          this.handleChangeTenantId= this.handleChangeTenantId.bind(this);
          this.handleSubmit = this.handleSubmit.bind(this);
          this.handleupload = this.handleupload.bind(this);
          this.handleTenantIdValidation = this.handleTenantIdValidation.bind(this);
          this.handleTenantAdminUrl = this.handleTenantAdminUrl.bind(this);
  
      };
  
      handleChangeTenantUrl(event){
          this.setState({TenantUrl: event.target.value});
      }
  
      handleChangeCertificatePassword(event){
          this.setState({CertificatePassword: event.target.value});
      }
  
      handleChangeTenantId(event){
          this.setState({TenantId: event.target.value});
      }
  
      beforeUpload(file) {
          const isJPG = file.type === 'image/jpeg';
          if (!isJPG) {
            message.error('You can only upload JPG file!');
          }
      }
  
      handleupload(info){
          //let files = e.target.files;
          if (info.file.status === 'uploading') {
              this.setState({ loading: true });
              return;
          }
  
          if (info.file.status === 'done') {
              this.setState({ loading: false });
              this.setState({ 'selectedFile': info.file });
          }
  
      }
  
      handleTenantIdValidation(rule, value, callback){
          const form = this.props.form;
          const str = form.getFieldValue('tenantid');
  
          var re = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
          if (str &amp;&amp; !str.match(re)) {
              this.setState({buttondisabled: true});
              callback('Tenant id is not correctly formated id');            
          } 
          else {
              this.setState({buttondisabled: false});
              callback();
          }
      }
  
      handleTenantAdminUrl(rule, value, callback){
          const form = this.props.form;
          const str = form.getFieldValue('tenantadminurl');
  
          var re = /^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&amp;'\(\)\*\+,;=.]+$/i;
          if (str &amp;&amp; !str.match(re)) {
              this.setState({buttondisabled: true});
              callback('Tenant Url is not correctly formated id');
          } 
          else {
              this.setState({buttondisabled: false});
              callback();
          }
      }
  
  
      handleSubmit(e){
          e.preventDefault();
          this.props.form.validateFieldsAndScroll((err, values) =&gt; {
              if (!err) {
                  /*Notification(
                  'success',
                  'Received values of form',
                  JSON.stringify(values)
                  );*/
  
                  let data = new FormData();
                  //Append files to form data
                  data.append("model", JSON.stringify({ "TenantId": this.state.TenantId, "TenantUrl": this.state.TenantUrl, "CertificatePassword": this.state.CertificatePassword }));
                  //data.append("model", {"TenantId": this.state.TenantId, "TenantUrl": this.state.TenantUrl, "TenantPassword": this.state.TenantPassword });
  
                  let files = this.state.selectedFile;
                  for (let i = 0; i &lt; files.length; i++) {
                    data.append("file", files[i], files[i].name);
                  }
  
                  const options = {
                    method: 'put',
                    body: data,
                    config: {
                      headers: {
                        'Content-Type': 'multipart/form-data'
                      }
                    }
                  };
  
                  adalApiFetch(fetch, "/Tenant", options)
                    .then(response =&gt; response.json())
                    .then(responseJson =&gt; {
                      if (!this.isCancelled) {
                        this.setState({ data: responseJson });
                      }
                    })
                    .catch(error =&gt; {
                      console.error(error);
                  });
              }
          });      
      }
  
  
  
      render() {
          const { getFieldDecorator } = this.props.form;
  
          const formItemLayout = {
          labelCol: {
              xs: { span: 24 },
              sm: { span: 6 },
          },
          wrapperCol: {
              xs: { span: 24 },
              sm: { span: 14 },
          },
          };
          const tailFormItemLayout = {
          wrapperCol: {
              xs: {
              span: 24,
              offset: 0,
              },
              sm: {
              span: 14,
              offset: 6,
              },
          },
          };
          return (
              &lt;Form onSubmit={this.handleSubmit}&gt;
                  &lt;FormItem {...formItemLayout} label="Tenant Id" hasFeedback&gt;
                  {getFieldDecorator('tenantid', {
                      rules: [
                      {
                          required: true,
                          message: 'Please input your tenant id',
                      },
                      {
                          validator: this.handleTenantIdValidation
                      }],
                  })(&lt;Input name="tenantid" id="tenantid" onChange={this.handleChangeTenantId}/&gt;)}
                  &lt;/FormItem&gt;
                  &lt;FormItem {...formItemLayout} label="Certificate Password" hasFeedback&gt;
                  {getFieldDecorator('certificatepassword', {
                      rules: [
                      {
                          required: true,
                          message: 'Please input your password!',
                      }
                      ],
                  })(&lt;Input type="password" name="certificatepassword" id="certificatepassword" onChange={this.handleChangeCertificatePassword}/&gt;)}
                  &lt;/FormItem&gt;
                  &lt;FormItem {...formItemLayout} label="Tenant admin url" hasFeedback&gt;
                  {getFieldDecorator('tenantadminurl', {
                      rules: [
                      {
                          required: true,
                          message: 'Please input your tenant admin url!',
                      },
                      {
                          validator: this.handleTenantAdminUrl
                      }],
                  })(&lt;Input name="tenantadminurl" id="tenantadminurl"  onChange={this.handleChangeTenantUrl} /&gt;)}
                  &lt;/FormItem&gt;
                  &lt;FormItem {...formItemLayout} label="Certificate File"&gt;
                      &lt;Upload  onChange={this.handleupload} beforeUpload={this.beforeUpload}&gt;
  
                          &lt;Button &gt;
                              &lt;Icon type="upload" /&gt; Click to Upload
                          &lt;/Button&gt;
                      &lt;/Upload&gt;
  
                  &lt;/FormItem&gt;
                  &lt;FormItem {...tailFormItemLayout}&gt;
                      &lt;Button type="primary" htmlType="submit" disabled={this.state.buttondisabled}&gt;
                          Register tenant
                      &lt;/Button&gt;
                  &lt;/FormItem&gt;
              &lt;/Form&gt;
          );
      }
  }
  
  const WrappedRegisterTenantForm = Form.create()(RegisterTenantForm);
  export default WrappedRegisterTenantForm;
  </code></pre>