Spring应用如何接收包含JSON对象与附件的multipart请求
问题原因
你之前的代码无法运行是因为@RequestBody仅支持接收application/json类型的请求体,而文件上传需要使用multipart/form-data请求类型,两种请求格式互斥,无法在同一个接口中同时使用。
解决方案
使用@RequestPart注解替代@RequestBody接收JSON对象,同时指定接口接收multipart/form-data类型的请求:
import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.multipart.MultipartFile; import javax.validation.Validated; // 其余依赖根据你自己的项目补充即可 @PutMapping(value = "/{id}/update", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public void updateCar(@PathVariable(value = "id") Long carId, @Validated @RequestPart("car") Car car, @RequestPart("file") MultipartFile file) throws ResourceNotFoundException, IOException { // 这里可以正常获取car对象和上传的file文件 }
注意:如果使用传统Spring MVC而非Spring Boot,需要额外在配置类中注册Multipart解析器:
@Bean public CommonsMultipartResolver multipartResolver() { CommonsMultipartResolver resolver = new CommonsMultipartResolver(); resolver.setMaxUploadSize(10*1024*1024); // 可自定义最大上传大小,这里是10MB return resolver; }
Postman测试方法
- 选择请求方式为PUT,输入对应的接口地址
- 切换到
Body标签,选择form-data格式 - 新增第一条参数:key填
car,鼠标hover在key输入框右侧,下拉选择类型为JSON,值填写符合Car结构的JSON字符串 - 新增第二条参数:key填
file,下拉选择类型为File,点击值输入框选择本地要上传的文件 - 发送请求即可正常调用
报错截图


内容的提问来源于stack exchange,提问作者metamorphogenesis
相关产品推荐
相关产品推荐

