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