You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中RestTemplate传递Multipart请求参数失败排查

解决RestTemplate调用Multipart接口时的MissingServletRequestPartException问题

你遇到的问题核心在于:直接传递byte[]无法让服务端正确解析为MultipartFile。

问题原因

服务端Controller用@RequestParam("image") MultipartFile接收文件,但你在RestTemplate中直接把文件的byte[]放入请求体。虽然请求里确实存在image参数名,但Spring的Multipart解析器需要文件的元数据(比如文件名、Content-Type)才能将二进制数据解析为MultipartFile对象,单纯的byte[]没有这些元信息,导致解析失败。

解决方案

用ByteArrayResource包装文件字节,提供必要的元数据:

修改调用方代码如下:

@Override
public UploadImageResponse uploadFile(UploadImageRequest request) {
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.MULTIPART_FORM_DATA);
    headers.add(HttpHeaders.AUTHORIZATION, Constants.BEARER + " " + TokenContext.get());

    MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
    // 用ByteArrayResource包装文件字节,重写getFilename提供文件名
    ByteArrayResource imageResource = new ByteArrayResource(request.getFile().getBytes()) {
        @Override
        public String getFilename() {
            return request.getFile().getOriginalFilename();
        }
    };
    body.add("image", imageResource);

    HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);
    ResponseEntity<UploadImageResponse> response = restTemplate
            .postForEntity(String.format(IMAGE_UPLOAD_URL, MEDIA_SERVICE_HOST, request.getPostId()), requestEntity, UploadImageResponse.class);

    return response.getBody();
}

额外检查项

如果修改后仍有问题,确认RestTemplate是否包含FormHttpMessageConverter:
默认RestTemplate会自动配置该转换器,但如果是自定义Bean,需确保它被加入转换器列表:

@Bean
public RestTemplate restTemplate() {
    RestTemplate restTemplate = new RestTemplate();
    restTemplate.getMessageConverters().add(new FormHttpMessageConverter());
    return restTemplate;
}

原理说明

ByteArrayResource实现了InputStreamSource接口,Spring的Multipart解析器可通过它读取文件输入流,重写的getFilename()方法提供了文件名,满足MultipartFile解析所需的元数据条件,服务端就能正确将请求参数解析为MultipartFile对象。

内容的提问来源于stack exchange,提问作者Akheel Pasha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 00:50:23