如何在 Spring 应用程序中接收多部分请求

How to receive multipart request in Spring App

我看过很多资源,也看过一些关于 SO 的问题,但没有找到解决方案。

我想发送到我的 Spring 应用程序 POST/PUT-requests,其中包含 JSON-对象 Car 和附件。

目前我有一个 CarController 可以正确处理 JSON-objects

@PutMapping("/{id}/update")
public void updateCar(@PathVariable(value = "id") Long carId, @Validated @RequestBody Car car) throws ResourceNotFoundException {
    // I can work with received car
}

我还有一个 FileController 可以与 file

一起正常工作
@PostMapping("/upload")
public void uploadFiles(@RequestParam("file") MultipartFile file) throws IOException {
    // I can work with received file
}

但是我的方法应该如何才能同时适用于 carfile?此代码未向我提供任何 carfile.

@PutMapping("/{id}/update")
public void updateCar(@PathVariable(value = "id") Long carId, @Validated @RequestBody Car car, @RequestParam("file") MultipartFile file) throws ResourceNotFoundException, IOException {
    // can not work neither with car nor with file
}

在 Postman 的测试中,单独的控制器运行良好。但是当我尝试第三个代码时,我得到了这些结果:

您可以使用 @RequestMapping 注释的 consumes = { MediaType.MULTIPART_FORM_DATA_VALUE } 字段和方法参数的 @RequestPart 注释:

ResponseEntity<> foo(@RequestPart ParType value, @RequestPart MultipartFile anotherChoice) {
...

是的,我multipart/form-data@RequestParts 而不是正文和参数:

@PutMapping(value = "/{id}/update", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
public void updateCar(@PathVariable(value = "id") Long carId,
        @RequestPart("car") Car car, 
        @RequestPart("file") MultipartFile file) {
   ...

然后在 Postman 中:

  • 使用正文>表单数据
  • 问题时:
    • 显示Content-Type列。
    • 每个部分设置Content-Type

您的代码没有任何问题,可以按原样运行。

当它是多部分请求时,您最终可以通过使用 @RequestPart 而不是 @RequestParam 和 @RequestBody 来提高它的可读性。

您可以在本文中找到有关多部分请求的更多详细信息https://www.baeldung.com/sprint-boot-multipart-requests

最重要的是,使其工作/或以正确的方式进行测试:

使用 postman 进行多部分请求时,您必须定义每个 RequestPart 的内容类型。

它是表单数据屏幕中的隐藏列,您可以按如下方式显示:

选中“Content-Type”框,新列将出现:

最后,定义每个部分的内容类型。