java实现文件下载
下载原理
1.需要通过HttpServletResponse.setContentType方法设置Content-Type头字段的值,为浏览器无法使用某种方式或激活某个程序来处理的MIME类型,例如,"application/octet-stream"或"application/x-msdownload"等.
2.需要通过HttpServletResponse.setHeader方法设置Content-Disposition头的值为"attachment;filename=文件名".
3.读取下载文件,调用HttpServletResponse.getOutputStream方法返回的ServletOutputStream对象来向客户端写入附件文件内容.
/**
* 下载文件
* @param fileId 文件ID
* @param session
* @param request
* @param response
* @return 成功下载文件,失败返回0
* @throws IOException
*/
@RequestMapping("/download.do")
public int downloadFile(Integer fileId, HttpSession session ,HttpServletRequest request, HttpServletResponse response) throws IOException {
int keyd = -1;
// 判断用户是否有权限下载这个文件
if(session.getAttribute("keyd") != null){
kid = (int) session.getAttribute("keyd");
Advertisement advertisement = advanceService.selectByPrimaryKey(fileId);
//根据文件id在数据库中获取文件名
String advertis = advertisement.getContent();
int advertisKeyd =advertisement.getkId();
// 如果用户的KID和文件的KID不同,则说明用户与文件不是一个公司的,那么禁止下载
if(advertisKeyd != keyd){
return 0;
}
//文件所在目录路径
String filePath = UPLOADFILEBASEPATH + advertis;
System.out.println("文件路径:" + filePath);
//得到该文件
File file = new File(filePath);
if(!file.exists()){
System.out.println("Have no such file!");
return 0;//文件不存在就退出方法
}
FileInputStream fileInputStream = new FileInputStream(file);
//设置Http响应头告诉浏览器下载这个附件,下载的文件名也是在这里设置的
response.setHeader("Content-Disposition", "attachment;Filename=" + URLEncoder.encode(advertis, "UTF-8"));
OutputStream outputStream = response.getOutputStream();
byte[] bytes = new byte[2048];
int len = 0;
while ((len = fileInputStream.read(bytes))>0){
outputStream.write(bytes,0,len);
}
fileInputStream.close();
outputStream.close();
}
return 0;
}