原理是使用java.io中的File类打开要下载的文件,用输入流将文件读入系统,再将response中的输出流连接到系统,通过输入流和输出流进行文件下载。
在response的响应头中设置下载文件的文件名
/**
* 下载文件
* @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 kid = -1;
// 判断用户是否有权限下载这个文件
if(session.getAttribute("kid") != null){
kid = (int) session.getAttribute("kid");
Advertisement advertisement = advanceService.selectByPrimaryKey(fileId);
//根据文件id在数据库中获取文件名
String advertis = advertisement.getContent();
int advertisKid =advertisement.getkId();
// 如果用户的KID和文件的KID不同,则说明用户与文件不是一个公司的,那么禁止下载
if(advertisKid != kid){
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;
}