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

来源:互联网 发布:服务器编程项目 编辑:程序博客网 时间:2024/06/04 17:54

后台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>");   
         }   

0 0
原创粉丝点击