SpringMVC 大文件下载

最近想要分享一个在线下载的数据文件,开始选用了用了 Commons IO 包中的 FileUtils ,具体方式如下

@RequestMapping("download")
public ResponseEntity<byte[]> download(String filename,HttpServletRequest request) throws IOException{
	String path = request.getServletContext().getRealPath("WEB-INF/data/");
	File file = new File(path + filename);
    HttpHeaders headers=new HttpHeaders();
    headers.setContentDispositionFormData("attachment",URLEncoder.encode(filename,"UTF-8"));
	headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
	return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers,HttpStatus.OK);
}

这种方式下载小于20MB的文件还行,再大的就会报错 ,报错信息:java.lang.OutOfMemoryError: Java heap space
原因在于FileUtils.readFileToByteArray 会把文件一次性读入内存中,当文件的大小超过JVM和Tomcat的内存配置时就会OutOfMemory

所以改用了将文件流分字节段输出的方式

@RequestMapping("download")
public void download(String filename,HttpServletRequest request,HttpServletResponse response) throws IOException{
	String path = request.getServletContext().getRealPath("WEB-INF/data/");
	File file = new File(path + filename);
	response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(filename,"UTF-8"));
    response.addHeader("Content-Type","application/json;charset=UTF-8");
    try(
    	InputStream is = new FileInputStream(file);
        OutputStream os = response.getOutputStream();
    	){
            int read = 0;
            byte[] bytes = new byte[2048];
            while ((read = is.read(bytes)) != -1)
                os.write(bytes, 0, read);
        }
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值