如何在Spring Boot中正确接收携带base64文件的JSON格式POST请求
问题原因
你当前的请求和后端接收逻辑存在类型不匹配问题:
- 你发送的是
Content-Type: application/json请求,请求体中的file字段是图片的Base64编码字符串 - Spring中
MultipartFile类型仅支持接收multipart/form-data类型请求中的二进制文件参数,Jackson序列化框架无法直接将JSON中的字符串自动转换为MultipartFile对象,因此file字段会被赋值为null,而结构匹配的annex对象可以正常被解析。
两种可行修复方案
方案1:保留当前Base64传参逻辑,仅修改后端DTO
将你用来接收@RequestBody的DTO类中,file字段的类型从MultipartFile改为String,拿到Base64字符串后手动解码为字节流即可后续处理:
// 1. 修改DTO字段定义 private String file; // 原定义为MultipartFile,修改为String // 2. 业务逻辑中解码Base64 import java.util.Base64; // ...... byte[] fileBytes = Base64.getDecoder().decode(yourDto.getFile()); // 后续可将字节数组写入本地存储、上传OSS等
方案2:改用标准表单文件上传,性能更优
该方案避免了Base64编码带来的33%额外体积开销,是文件上传的通用实现:
- 调整后端接口定义,拆分接收业务对象和文件参数:
@PostMapping("/api/reports/annex/save/{reportId}") public Result saveAnnex(@PathVariable Long reportId, @RequestPart Annex annex, @RequestPart MultipartFile file) { // 业务处理逻辑 }
- 调整IntelliJ HTTP客户端的请求格式为
multipart/form-data:
POST http://localhost:7000/api/reports/annex/save/307 Content-Type: multipart/form-data; boundary=request-boundary --request-boundary Content-Disposition: form-data; name="annex" Content-Type: application/json { "id": "", "reportId": "307", "title": "TEST FILE", "description": "TEST DESCRIPTION", "creationDate": "", "document_path": "" } --request-boundary Content-Disposition: form-data; name="file"; filename="test.jpg" Content-Type: image/jpeg < 替换为你本地图片的绝对路径,例如 /home/user/test.jpg 或 C:\Users\xxx\test.jpg --request-boundary--
内容的提问来源于stack exchange,提问作者arevilla009
相关产品推荐
相关产品推荐

