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

使用RestTemplate发送Multipart-formdata失败,请求数据未达服务器

问题分析与修复方案

你的RestTemplate请求无法正常工作,核心问题出在请求头设置和消息转换器的处理上,以下是具体原因和修复方案:

1. 手动设置Content-Type导致请求解析失败

发送multipart/form-data请求时,HTTP协议要求请求头必须包含自动生成的boundary分隔符(用于区分不同表单字段)。但你手动设置了Content-Type: multipart/form-data,这会覆盖RestTemplate自动生成的包含boundary的完整头信息,服务器无法识别表单边界,自然解析不到提交的数据。

2. 重复添加消息转换器可能引发冲突

RestTemplate默认已经内置了FormHttpMessageConverter,你再次手动添加该转换器,可能导致转换器顺序混乱或重复处理,干扰请求的正常序列化。

修复后的代码

public ResponseEntity<Map> postImage(URI postURL, String base64) {
    HttpHeaders headers = new HttpHeaders();
    headers.add("Authorization", "Basic basicAuthString");
    // 移除手动设置的Content-Type,RestTemplate会自动生成包含boundary的正确请求头
    // headers.add("Content-Type","multipart/form-data");

    MultiValueMap<String, Object> form = new LinkedMultiValueMap<>();
    form.add("$myPicture", base64);

    RestTemplate restTemplate = new RestTemplate();
    // 移除重复添加转换器的代码,默认已包含FormHttpMessageConverter
    // FormHttpMessageConverter converter = new FormHttpMessageConverter();
    // restTemplate.getMessageConverters().add(converter);

    HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(form, headers);
    ResponseEntity<Map> responseObject = restTemplate.postForEntity(postURL, requestEntity, Map.class);
    return responseObject;
}

额外优化提示

如果服务器期望接收的是二进制图片文件而非base64字符串,需要将base64解码后包装为ByteArrayResource传入表单:

byte[] imageBytes = Base64.getDecoder().decode(base64);
ByteArrayResource resource = new ByteArrayResource(imageBytes) {
    @Override
    public String getFilename() {
        // 若服务器要求文件名,可按需设置,否则返回null
        return "uploaded_picture.jpg";
    }
};
form.add("$myPicture", resource);

内容的提问来源于stack exchange,提问作者Shailendra Garg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:22:10