使用ByteArrayResource替换MultipartFile转换File实现RestTemplate文件上传

想必大家都会有通过 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!";
	}

其实文件的处理无非就是处理字节流。所以我就是从这个思路出发去换种方式实现想要的功能并且性能也比文件转换要更优。

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值