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

Spring Boot使用RestTemplate转发图片到第三方接口返回500错误如何解决

问题根因

你当前代码的核心错误是对图片二进制数据做了不必要的UTF-8字符串转换:图片属于二进制文件,强行用字符编码转换会直接损坏文件内容,导致第三方接口接收到非法数据返回500错误。此外原代码还存在postForEntity返回值类型匹配错误、异常分支未返回结果的问题。

修复方案

你不需要把图片转成字符串,直接把二进制内容封装成资源对象放入multipart表单传递即可,修复后的Service代码如下:

@Service
public class DocumentsReceivingService {
    @Autowired
    RestTemplate restTemplate;
    private final String UPLOADFILE = "http://exampleResourese/sendimg";
    Logger logger = LoggerFactory.getLogger(DocumentsReceivingService.class);
    public ResponseEntity<?> uploadAndGetListDocuments(MultipartFile files) throws IOException{
        LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
        // 直接封装二进制字节为ByteArrayResource,不需要转字符串
        ByteArrayResource resource = new ByteArrayResource(files.getBytes()){
            // 必须重写getFilename方法,否则multipart表单无法识别为文件类型参数
            @Override
            public String getFilename() {
                return files.getOriginalFilename();
            }
        };
        map.add("images", resource);
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(map, headers);
        // 修正返回值接收类型,postForEntity返回的是ResponseEntity对象
        ResponseEntity<String> response = restTemplate.postForEntity(UPLOADFILE, requestEntity, String.class);
        return  ResponseEntity.ok(response.getBody());
    }
}
补充说明
  • SpringBoot默认自动注入的RestTemplate已经内置了FormHttpMessageConverter,可以正常处理multipart/form-data请求,无需额外配置。
  • 如果第三方接口明确要求传入Base64编码的图片字符串(而非直接传文件),可以把上述代码中的ByteArrayResource替换为Base64编码逻辑即可:
String base64Img = Base64.getEncoder().encodeToString(files.getBytes());
map.add("images", base64Img);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:15:02