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

SpringBoot实现字节数组转文件发送POST请求及错误解决

问题修复方案

错误核心原因是你没有给Multipart表单中的文件部分指定有效文件名,且全局设置ContentDisposition的方式不符合Multipart请求规范。以下是修正后的完整代码:

public String Test(RequestBody requestBody) throws RFConnectionException {
    ResponseEntity<String> response;
    try {
        // 注意:JSON中的attachmentData是Base64编码字符串,必须先解码为字节数组
        String base64Data = requestBody.getBody().getAttachment().getAttachmentData();
        byte[] attachmentData = Base64.getDecoder().decode(base64Data);
        String attachmentName = requestBody.getBody().getAttachment().getAttachmentName();

        MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
        // 重写ByteArrayResource的getFilename方法,为文件指定名称
        ByteArrayResource resource = new ByteArrayResource(attachmentData) {
            @Override
            public String getFilename() {
                return attachmentName;
            }
        };
        body.add("file", resource);

        // 仅设置全局Content-Type即可,无需全局配置Content-Disposition
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);

        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);
        response = restTemplate.postForEntity(config.getAttachmentUrl(), requestEntity, String.class);

    } catch (Exception exception) {
        log.error("Exception occurred while calling: " + exception.getMessage());
        throw new RFConnectionException("Error while getting response::" + exception.getMessage());
    }
    return response.getBody();
}

关键修正说明

  1. Base64解码处理:原JSON中的attachmentData是Base64编码的字符串,必须解码为字节数组才能生成有效文件,原代码直接使用字符串转字节数组会导致文件内容乱码。
  2. 为资源指定文件名:通过匿名内部类重写ByteArrayResource的getFilename()方法,让Spring能识别该Multipart部分对应的文件名,这是解决"Must have at least one MIME part with a filename"错误的核心。
  3. 移除全局ContentDisposition设置:Multipart请求的每个文件部分的Content-Disposition信息由资源自身的文件名生成,无需在全局请求头中配置。

额外配置提示

如果你的RestTemplate未配置Multipart消息转换器,需添加如下配置确保正常处理Multipart请求:

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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 11:42:19