如何在 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
}
但是我的方法应该如何才能同时适用于 car
和 file
?此代码未向我提供任何 car
或 file
.
@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
、@RequestPart
s 而不是正文和参数:
@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”框,新列将出现:
最后,定义每个部分的内容类型。
我看过很多资源,也看过一些关于 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
}
但是我的方法应该如何才能同时适用于 car
和 file
?此代码未向我提供任何 car
或 file
.
@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
、@RequestPart
s 而不是正文和参数:
@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”框,新列将出现:
最后,定义每个部分的内容类型。