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
相关产品推荐
相关产品推荐

