想必大家都会有通过 MultipartFile 接收前端的文件,然后后端通过 RestTemplate 实现文件上传。这里就涉及一个问题,可能小伙伴们看到网上大部分都是先将 MultipartFile 转换成 File ,然后再实现文件上传。其实我本人是不推荐这种实现方式的,因为这种方式可能会给服务器造成 “业务垃圾”,即有可能会在服务器上生成一些其它垃圾。因此,大家可以深入去看网上各种各样的转换。如下代码是我随便截图的:
// type1
File file = new File(Objects.requireNonNull(multipartFile.getOriginalFilename()));
FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file);
FileSystemResource resource = new FileSystemResource(file);
//type2
if (!file.isEmpty()) {
try {
String filePath = "D:/upload/test/"+file.getOriginalFilename();
System.out.println(filePath);
File saveDir = new File(filePath);
if (!saveDir.getParentFile().exists())
saveDir.getParentFile().mkdirs();
file.transferTo(saveDir);
map.put("res","上传成功");
return map;
} catch (Exception e) {
e.printStackTrace();
}
}
不管type1或type2等等,核心思想都是创建临时File文件,然后将MultipartFile转换成File临时文件,中间处理完业务,最后再删除File临时文件。
我采用这种方式,但是发现产生了一些其它的垃圾,如图所示:
有些甚至是TMP结尾的垃圾文件,到时候我们操作删除,删除的只能是png文件。如果处理不当,可能删除文件失效,那么文件就会保留在服务器上。这不是我们想要的效果。
解决思路:
采用 ByteArrayResource ,至于它是啥,大家可以自行去学习。代码如下:
@RequestMapping("/file")
@ResponseBody
public String testDemo(@RequestParam("uploadFile") MultipartFile file,StandardMultipartHttpServletRequest request) throws IOException {
String url = "https://www.uploadFile.com/upload";
RestTemplate template = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "multipart/form-data");
headers.add("Content-Length",String.valueOf(file.getSize()));
MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();
ByteArrayResource resource = new ByteArrayResource(file.getBytes()) {
@Override
public String getFilename() {
return file.getOriginalFilename();
}
};
parts.add("file",resource);
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<>(parts, headers);
ResponseEntity<String> responseEntity = template.postForEntity(url,httpEntity,String.class);
return "Hello World!";
}
其实文件的处理无非就是处理字节流。所以我就是从这个思路出发去换种方式实现想要的功能并且性能也比文件转换要更优。