springmvc下载文件以及下载大文件方法

转自:http://blog.csdn.net/lzy295481710/article/details/52228405

后台springmvc方法: 

@RequestMapping(value = "/down", method = RequestMethod.GET) 

public ResponseEntity download(String type,HttpSession session)
throws IOException {
String filename="";
switch(type){
case "1d":filename="一手楼盘操作说明.docx";break;
case "1m":filename="一手楼盘管理.mp4";break;
case "2d":filename="二手房源操作说明.docx";break;
case "2m":filename="二手房源列表管理.mp4";break;
case "2km":filename="二手楼盘房源管理.mp4";break;
case "xd":filename="小区管理操作说明.docx";break;
case "xm":filename="小区信息管理.mp4";break;
case "mm":filename="我发布的房源.mp4";break;
case "sm":filename="系统管理.mp4";break;
default:break;
}
   File file = new File(session.getServletContext().getRealPath("/")+"attachment/"+filename);
   String dfileName = new String(file.getName().getBytes("gb2312"), "iso8859-1");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", dfileName);
return new ResponseEntity(FileUtils.readFileToByteArray(file), headers,
HttpStatus.CREATED);
}


前端用a连接:

<a id="edit"   href="${baseURL}/downfile/down?type=2m" style="margin-left: 170px;">
                <i class="glyphicon glyphicon-edit"></i> 二手房源列表操作视频
            </a>


springmvc提供的简单的下载功能,这种有局限性,当文件数据过大的时候(大概超过40M左右)就会容易内存溢出,因为这种方式是:FileUtils.readFileToByteArray(file),一次性读取文件的,如果文件过大,可以考虑分批读取。下面提供分批读取的方法,这种可以解决文件过大下载内存溢出的问题:

 try {   
   File file = new File(session.getServletContext().getRealPath("/")+"attachment/"+filename);
             if (file.exists()) {   
                String dfileName = file.getName();   
                InputStream fis = new BufferedInputStream(new FileInputStream( file));   
                 response.reset();   
                 response.setContentType("application/x-download");
                 response.addHeader("Content-Disposition","attachment;filename="+ new String(dfileName.getBytes(),"iso-8859-1"));
                 response.addHeader("Content-Length", "" + file.length());   
                OutputStream toClient = new BufferedOutputStream(response.getOutputStream());   
               response.setContentType("application/octet-stream");   
                 byte[] buffer = new byte[1024 * 1024 * 4];   
                 int i = -1;   
                 while ((i = fis.read(buffer)) != -1) {   
                     toClient.write(buffer, 0, i);  
                     
                 }   
                 fis.close();   
                 toClient.flush();   
                 toClient.close();   
                 try {
                 response.wait();
           } catch (InterruptedException e) {
            e.printStackTrace();
           }  
             } else {   
                PrintWriter out = response.getWriter();   
                out.print("<script>");   
                out.print("alert(\"not find the file\")");   
                out.print("</script>");   
             }   
         } catch (IOException ex) {   
            PrintWriter out = response.getWriter();   
                out.print("<script>");   
                out.print("alert(\"not find the file\")");   
                out.print("</script>");   
         } 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值