使用未发送到正文的文件上传来反应js fetch api

Posted

技术标签:

【中文标题】使用未发送到正文的文件上传来反应js fetch api【英文标题】:react js fetch api using file upload not being sent to body 【发布时间】:2021-03-03 09:39:19 【问题描述】:

这是我的代码

   let formData = new FormData(); 
     
      // Update the formData object 
      formData.append( 
        "myFile", 
        this.state.product_picture, 
        this.state.product_picture.name 
      ); 
      var options =  content: formData ;
        const token =  JSON.parse(localStorage.getItem('token'));
        const requestOptions = 
            method: 'POST',
            headers: 
                'Accept': 'application/json',
                'Content-Type': 'application/json',
              ,
              body: JSON.stringify(
                product_name:this.state.product_name,
                product_description:this.state.product_description,
                product_picture:formData,
                category_name:this.state.category_choosen,
              )
        ;
        fetch('http://cms.test/api/products/insert_supplier_product?token='+token, requestOptions)
            .then(response => response.json())
            .then(data => 
                this.setState( product: data.product)
            )
            .catch(error =>
                console.log("Product creation error", error);
            );

我有这个 fetch api,它总是给出 422 响应 这里的身体是问题 state 里面有一些字符串,但是 this.state.product_picture 里面有一个文件

希望有人可以提供帮助!谢谢!

解决方案:使用 axios 调用 api 解决了我的问题

【问题讨论】:

【参考方案1】:

您不能在请求中发送 JSON 对象中的文件(至少不能在没有 Base64 编码的情况下)。通过以下方式更改您的代码以发送包含您的表单的文件。

    let formData = new FormData(); 
 
   // Update the formData object 
   formData.append( 
    "myFile", 
    this.state.product_picture, 
    this.state.product_picture.name 
    ); 

   formData.append("product_name",this.state.product_name);
   formData.append("product_description",this.state.product_description);
   formData.append("category_name",this.state.category_choosen);

   var options =  content: formData ;
    const token =  JSON.parse(localStorage.getItem('token'));
    const requestOptions = 
        method: 'POST',
        headers: 
            'Accept': 'application/json',
            'Content-Type': 'multipart/form-data',
          ,
          body: formData
    ;
    fetch('http://cms.test/api/products/insert_supplier_product?token='+token, requestOptions)
        .then(response => response.json())
        .then(data => 
            this.setState( product: data.product)
        )
        .catch(error =>
            console.log("Product creation error", error);
        );

【讨论】:

数据仍然没有被解析它说所有数据都是无效的 乐于助人!!

以上是关于使用未发送到正文的文件上传来反应js fetch api的主要内容,如果未能解决你的问题,请参考以下文章

@testing-library/与 msw/node 反应; window.fetch 未在 POST 上返回正文

正文未在“获取”POST请求和(我的)解决方案中发送[重复]

vue使用fetch.js发送post请求java后台无法获取参数值

无法在本机反应中使用 fetch 执行 POST 请求

如何在 React 中使用 fetch 和表单数据发布对象?

电子邮件正文在文件中发送 [Gmail API, Node.js]