使用Apache HTTP Client向Spring Boot传文件时遇HTTP 400错误
问题排查与解决:Apache HttpClient传文件到Spring Boot报MissingServletRequestPartException
问题重现
使用Apache HTTP Client向Spring Boot服务器传输文件时收到HTTP 400错误,报错信息:
Resolved [org.springframework.web.multipart.support.MissingServletRequestPartException: Required request part 'file' is not present]
客户端代码:
HttpPost request = new HttpPost(new URIBuilder(URI.create(host)).setPath("api").addParameter("id", id).build()); request.setEntity(MultipartEntityBuilder.create() .addPart("file", new InputStreamBody(myStream, MULTIPART_FORM_DATA)) .build()); CloseableHttpResponse response = httpClient.execute(request);
服务端代码:
@PostMapping(consumes = MULTIPART_FORM_DATA_VALUE) public void send(@RequestParam("id") String id, @RequestParam("file") MultipartFile file) throws IOException { // Do something }
已尝试的方案无效:
- 服务端:设置
spring.servlet.multipart.enabled=true、用@RequestPart替代@RequestParam - 客户端:添加
.setMode(BROWSER_COMPATIBLE)、使用addBinaryPart
核心问题与解决方法
1. 客户端InputStreamBody缺少文件名参数
Spring的MultipartFile需要识别文件元信息(比如文件名),当前使用的InputStreamBody只传入了流和媒体类型,未指定文件名,导致Spring无法正确解析为MultipartFile。
修改客户端代码,补充文件名参数:
// 第三个参数为自定义文件名,需保证非空 .addPart("file", new InputStreamBody(myStream, MULTIPART_FORM_DATA, "upload-file.txt"))
如果数据源是本地文件,推荐直接使用FileBody,它会自动携带完整文件元信息:
.addPart("file", new FileBody(new File("path/to/your/file"), MULTIPART_FORM_DATA))
2. 检查请求路径是否正确
客户端代码中setPath("api")可能缺少前缀斜杠,若服务端@PostMapping无额外路径前缀,正确路径应为"/api",否则请求会发送到域名根路径下的api节点,可能与服务端路由不匹配。
修改路径设置:
.setPath("/api")
3. 显式指定请求Content-Type(可选)
虽然MultipartEntityBuilder会自动生成multipart/form-data类型,但显式指定可避免潜在的类型解析问题:
request.setHeader(HttpHeaders.CONTENT_TYPE, MULTIPART_FORM_DATA_VALUE);
4. 服务端参数绑定调整(可选)
若上述修改后仍有问题,可尝试将服务端的@RequestParam改为@RequestPart,确保参数名与客户端完全匹配:
public void send(@RequestParam("id") String id, @RequestPart("file") MultipartFile file) throws IOException { // Do something }
内容的提问来源于stack exchange,提问作者BnJ
相关产品推荐
相关产品推荐

