前言:
不知不觉一周又过去了,这一周又要去搞flink,多数时间在配置环境,真的是配置环境==时间黑洞。唉,web还半生不熟呢,又去搞大数据,下次可能要去搞nlp了,也不知道终究会如何。这一周遇到一个问题,接收一个MultipartFile文件,使用restTemplate将其发送到另一个服务上去,直接将MultipartFile封装到对象中,转发的时候会抛出异常。原因:
MultipartFile是Spring框架中提供的一种用于文件处理的接口,一般用于前端进行文件的上传,后端使用MultipartFile类型来进行文件的接收;当使用RestTemplate的post方法进行来传递接收到的MultipartFile类型文件时,由于RestTemplate中并没有对应的转化器(Converter),无法将文件对象打包进body中,所以会抛出异常。参考:https://blog.csdn.net/lblblblblzdx/article/details/82919235
https://blog.csdn.net/qgnczmnmn/article/details/107087347
解决方案:
1. 将MultipartFile文件转成file对象private File multiPartFile2File(String path, MultipartFile multiFile) throws Exception {
if (multiFile == null) {
throw new Exception("multiFile文件找不到");
}
File file = new File(path);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
file.createNewFile();
multiFile.transferTo(file);
return file;
}
- 选择适当的RestTemplate转换器
public JSONObject upload(MultipartFile f) throws Exception {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
// 1. 转换成file
String filePath = tmpPath + UUID.randomUUID().toString();
File file = multiPartFile2File(filePath + "/" + f.getOriginalFilename(), f);
// 2. 重新构建成multipartfile并发送
params.add("f", new FileSystemResource(file));
HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(params, headers);
String body = "";
try {
body = restTemplate.postForEntity(upLoadUrl, entity, String.class).getBody();
} catch (Exception e) {
e.printStackTrace();
throw e;
}
JSONObject o = JSONObject.parseObject(body);
// 3. 删除临时目录
FileUtils.deleteDirectory(new File(filePath));
return parseResponse(o);
}
这种方式使用了ResourceHttpMessageConverter的转换方法来实现params到body内容的转换。
工作没多久,就有点想当咸鱼了=。= !人生到底应该追求何种生活?