【问题标题】:i am trying to upload a file using fetch API and formData - angular material我正在尝试使用 fetch API 和 formData 上传文件 - 角度材料
【发布时间】:2020-03-04 13:56:12
【问题描述】:

我正在尝试上传图片并将 formData 发送到后端。

我正在使用 formData.append 附加上载文件和 fetchAPI 以发送 formData。

我的输入如下所示

<input style="display:none" type="file"
                               (change)="fileChange($event)"
                               #fileInput>
fileChange(event) {
    let fileList: FileList = event.target.files;
    if (fileList.length > 0) {
      let file: File = fileList[0];
      let formData: FormData = new FormData();
    formData.append('uploadFile', file, file.name);
    console.log('formData', formData);
    this.handleUpload(formData);
    }
  }
handleUpload(formData) {
    const url = `/upload?`;
    let result;
    const req = new Request(proxyurl + url,
      {
        method: 'POST',
        headers: {
          'content-type': 'multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW'
    },
        body: formData
      });
    fetch(req)
      .then(response => response.text())
      .then(() => {
        if (result.data) {
          console.log('response ', result.data);
        } else {
          console.log('request failed');
        }
      })
      .catch(() => console.log('Can\'t access ' + url + ' response. Blocked by browser?'));
  }

当我点击服务时,我得到状态代码:422 Unprocessable Entity with below response

{"error":{"message":"?exception.illegalargument?"}}

请求负载如下

------WebKitFormBoundary8E02ll3T0mo433bu
Content-Disposition: form-data; name="uploadFile"; filename="Screen Shot 2019-10-04 at 10.49.34 AM.png"
Content-Type: image/png


------WebKitFormBoundary8E02ll3T0mo433bu--

请帮助我了解如何使其正常工作。

【问题讨论】:

  • 为什么要设置自己的标题?让浏览器完成它的工作。
  • 删除标题对我没有任何帮助
  • 什么是不设置自己的标头时的请求负载?
  • uploadFile: (binary), 当我点击查看源代码时,它显示如下 ------WebKitFormBoundaryqs0xw88pK72KS9wy Content-Disposition: form-data;名称="上传文件"; filename="屏幕截图 2019-11-07 at 12.49.12 PM.png" Content-Type: image/png ------WebKitFormBoundaryqs0xw88pK72KS9wy--
  • 你的意思是没有数据发送?你那里没有�PNG � � 字符串?您的文件的size 是什么?另外,您确定您的服务器正在等待后字段uploadFile?

标签: javascript angular-material fetch multipartform-data form-data


【解决方案1】:

我通过执行以下操作使其工作:

删除了标头并检查服务器是否需要上传文件。

下面的工作代码:

  fileChange(event) {
    let fileList: FileList = event.target.files;
    if (fileList.length > 0) {
      let file: File = fileList[0];
      let formData: FormData = new FormData();
      formData.append('uploadedFile', file, file.name);
      this.handleUpload(formData);
    }
  }

  handleUpload(formData) {
    const url = `/upload?`;
    let result;
    const req = new Request(url,
      {
        method: 'POST',
        headers: {},
        body: formData
      });
    fetch(req)
      .then(response => response.text())
      .then(() => {
        if (result.data) {
          console.log('response data ', result.data);
        } else {
          console.log('request failed');
        }
      })
      .catch(() => console.log('Can\'t access ' + url + ' response. Blocked by browser?'));
  }

【讨论】:

    【解决方案2】:

    当我不添加任何标题时它起作用了。

     handleUpload(formData) {
         const url = `/upload`;
         const proxyurl = 'https://cors-anywhere-proxy.herokuapp.com/';
         let result;
         const req = new Request(proxyurl + url,
           {
             method: 'POST',
             headers: {},
             body: formData
           });
         fetch(req)
           .then(response => response.text())
           .then(() => {
             if (result.data) {
               console.log('result.data', result.data);
             } else {
               console.log('request failed');
             }
           })
           .catch(() => console.log('Can\'t access ' + url + ' response. Blocked by browser?'));
       }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 1970-01-01
      相关资源
      最近更新 更多