最近开发过程中遇到这样的问题,在使用RestTemplate进行两个后台服务之间文件传递的时候,直接使用MultipartFile格式来传递的时候抛出异常。
MultipartFile是Spring框架中提供的一种用于文件处理的接口,一般用于前端进行文件的上传,后端使用MultipartFile类型来进行文件的接收;当使用RestTemplate的post方法进行来传递接收到的MultipartFile类型文件时,由于RestTemplate中并没有对应的转化器(Converter),无法将文件对象打包进body中,所以会抛出异常。
关于RestTemplate的详细解析,可以参考该博客:RestTemplate原理与使用
(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; }在开发中使用的是第一种方法,第二种没试过,有兴趣的可以试一下。