如何在 React 中发送包含 json 和文件的 FormData?

How to send FormData containing json and file in React?

提问人:Tronjesson 提问时间:11/14/2023 更新时间:11/15/2023 访问量:51

问:

我在前端使用 React,在后端使用 Spring boot。我正在尝试使用 React 中的 FormData 发送一个包含图像以及一些 json 数据的请求。

这是我当前在前端的代码:

const submitForm = (e: any) => {
    e.preventDefault();

   const swimArea = "{\"swimArea\" : {\"name\": \"aTESTTEST\", \"longitude\": \"15.47\",    \"latitude\": \"56.25\"}}";
   const formData = new FormData();
   formData.append('swimArea', JSON.stringify(swimArea));
   formData.append("file", e.target.file);

   const requestOptions = {
      method: "POST",
      headers: {
         "Content-Type": `multipart/form-data; boundary=----somefixedboundary`,
         "Access-Control-Allow-Origin": "*",
         "Access-Control-Allow-Methods": "DELETE, POST, GET, OPTIONS",
         "Access-Control-Allow-Headers": "Content-Type, Authorization, X-Requested-With",
      },
      body: formData,
   };
   fetch(
      "http://localhost:8080/api/v1/bathplace/newBathingPlace",
      requestOptions
   )
      .then((response) => response.json())
      .then((data) => {  // Continue with the data...
      });
};

Spring API 是这样的:

@PostMapping(value = "/newBathingPlace")
public ResponseObject addBathingPlace(@RequestPart AddBathingPlaceRequest swimArea, @RequestPart MultipartFile file) {
   // Handling the request...
   return new ResponseObject();
}

我已经用 Postman 测试了 API,它可以工作: Postman 中的 FormData Postman 中 FormData 的请求标头

现在来谈谈问题,在浏览器中出现以下错误:“message”: “Required request part 'swimArea' is not present”

我相信 react-code 缺少或错误,但不确定是什么。如果你知道什么,请给我指出正确的方向。 我尝试从服务器和客户端中删除文件实现。出现同样的错误。

reactjs spring-boot http postman multipartform-data

评论


答:

0赞 Hillel 11/14/2023 #1

只需更改为formData.append("file", e.target.file);formData.append("file", e.currentTarget.files.[0])

评论

0赞 Tronjesson 11/14/2023
文件部分不是导致问题的原因......即使我删除了formData.append(“file”, e.target.file);我仍然收到同样的错误。
0赞 MrSrv7 11/15/2023 #2

我觉得构造函数使用不当。您正在对 swimArea 对象进行两次字符串化。在创建对象时,您已经将其字符串化为FormData()

const swimArea = "{\"swimArea\" : {\"name\": \"aTESTTEST\", \"longitude\":
\"15.47\",\"latitude\": \"56.25\"}}";

,但你又在

formData.append('swimArea', JSON.stringify(swimArea));

您可以尝试以下操作。

const submitForm = (e) => {
    e.preventDefault();

    const swimArea = {
        swimArea: {
            name: "aTESTTEST",
            longitude: "15.47",
            latitude: "56.25"
        }
    };

    const formData = new FormData();
    formData.append('swimArea', JSON.stringify(swimArea));
    formData.append('file', e.target.files[0])

   const requestOptions = {
      method: "POST",
      headers: {
         "Content-Type": `multipart/form-data; boundary=----somefixedboundary`,
         "Access-Control-Allow-Origin": "*",
         "Access-Control-Allow-Methods": "DELETE, POST, GET, OPTIONS",
         "Access-Control-Allow-Headers": "Content-Type, Authorization, X-Requested-With",
      },
      body: formData,
   };
   fetch(
      "http://localhost:8080/api/v1/bathplace/newBathingPlace",
      requestOptions
   )
      .then((response) => response.json())
      .then((data) => {  // Continue with the data...
      });
};

也。使用 时,浏览器会自动将 设置为具有正确边界的 to。手动设置此标头可能会导致问题。FormDataContent-Typemultipart/form-data

0赞 Tronjesson 11/15/2023 #3

我终于上班了......我已经在这个问题上坚持了几个星期,在我在这里发布问题几个小时后,我解决了它,唉。

问题是我如何创建formdata,这是该部分的新代码:

const formData = new FormData();
const blob = new Blob([e.target.file.files[0]], { type: 'application/octet-stream' });
formData.append('swimArea', new Blob([JSON.stringify(swimArea)], { type: "application/json" }));
formData.append("file", blob);