【SpringBoot】使用RestTemplate在服务之间进行MultipartFile格式文件的传递
文章目录1、前言2、原因分析3、解决办法1、前言最近开发过程中遇到这样的问题,在使用RestTemplate进行两个后台服务之间文件传递的时候,直接使用MultipartFile格式来传递的时候抛出异常。2、原因分析MultipartFile是Spring框架中提供的一种用于文件处理的接口,一般用于前端进行文件的上传,后端使用MultipartFile类型来进行文件的接收;当使用RestTempl
1、前言
最近开发过程中遇到这样的问题,在使用RestTemplate进行两个后台服务之间文件传递的时候,直接使用MultipartFile格式来传递的时候抛出异常。
2、原因分析
MultipartFile是Spring框架中提供的一种用于文件处理的接口,一般用于前端进行文件的上传,后端使用MultipartFile类型来进行文件的接收;当使用RestTemplate的post方法进行来传递接收到的MultipartFile类型文件时,由于RestTemplate中并没有对应的转化器(Converter),无法将文件对象打包进body中,所以会抛出异常。
关于RestTemplate的详细解析,可以参考该博客:RestTemplate原理与使用
3、解决办法
(1)先将MultipartFile类型的对象转化为File类型,一下为转换的方法:
/**
* 将MultiPartFile转化为File
* @param path
* @param multiFile
* @return
* @throws IOException
*/
public static File multiPartFileToFile(String path,MultipartFile multiFile) throws IOException {
File file=new File(path);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
file.createNewFile();
multiFile.transferTo(file);
return file;
}
(2)选择适当的RestTemplate转换器
第一种方法:
public JSONObject upload(String url,MultipartFile file){
String path=xxxxxx/xx.mp4;
File tempFile=FileConvertUtil.multiPartFileToFile(path, file);
// 构建HttpEntity
MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
param.add("file", new FileSystemResource(tempFile));
HttpHeaders headers=new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, Object>> httpEntity=new HttpEntity<>(param, headers);
JSONObject jsonObject=restTemplate.postForEntity(url, httpEntity, JSONObject.class).getBody();
return jsonObject;
}
这种方式使用了ResourceHttpMessageConverter的转换方法来实现params到body内容的转换。
也可以使用第二种方法,使用ByteArrayHttpMessageConverter转换器:
public JSONObject upload(String url,MultipartFile file){
String path=xxxxxx/xx.mp4;
File tempFile=FileConvertUtil.multiPartFileToFile(path, file);
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
headers.add(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE);
MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
params.add("file", new ByteArrayResource(tempFile)) {
@Override
public String getFilename() {
return file.getOriginalFilename();
}
});
JSONObject jsonObject=restTemplate.postForEntity(url, httpEntity, JSONObject.class).getBody();
return jsonObject;
}
在开发中使用的是第一种方法,第二种没试过,有兴趣的可以试一下。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)