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(); }
关键修正说明
- Base64解码处理:原JSON中的
attachmentData是Base64编码的字符串,必须解码为字节数组才能生成有效文件,原代码直接使用字符串转字节数组会导致文件内容乱码。 - 为资源指定文件名:通过匿名内部类重写
ByteArrayResource的getFilename()方法,让Spring能识别该Multipart部分对应的文件名,这是解决"Must have at least one MIME part with a filename"错误的核心。 - 移除全局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
相关产品推荐
相关产品推荐

