文件下载就是将服务器中的文件下载到本地
两种方式:
- 通过超链接实现下载:暴露了下载文件的真实位置,并且只能下载 Web 应用程序下公开的目录文件,WEB-INF 目录除外。
- 编码实现下载:增强安全访问控制,可以下载除 Web 应用程序所在目录以外的文件,也可以将文件保存到数据库中。
- Web 服务器需要告诉浏览器其所输出内容的类型不是普通文本文件或 HTML 文件,而是一个要保存到本地的下载文件,这需要设置 Content-Type 的值为 application/x-msdownload或multipart/form-data二进制数据。
- Web 服务器希望浏览器不直接处理相应的实体内容,而是由用户选择将相应的实体内容保存到一个文件中,这需要设置 Content-Disposition 报头。
response.setContentType("multipart/form-data");//二进制传输数据
response.setHeader("Content-disposition", "attachment;filename="+ URLEncoder.encode(fileName,"utf-8"));
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
文件列表
文件序号
文件
${status.count}
${filename}
@RequestMapping("/showFiles")
public String showFiles(HttpSession session,Model model) throws IOException {
String uploadPath = session.getServletContext().getRealPath("/WEB-INF/upload");
File fileDir = new File(uploadPath);
ArrayList filename = new ArrayList<>();
File[] files = fileDir.listFiles();
for (File file: files) {
filename.add(file.getName());
}
model.addAttribute("files",filename);
return "filespage";
}
@RequestMapping("/down1/{filename}")
public String down(@PathVariable("filename")String filename, HttpSession session, HttpServletResponse response,Model model) throws IOException {
//要下载的文件地址
String uploadPath = session.getServletContext().getRealPath("/WEB-INF/upload");
//web下载文件的头部
//设置文件响应头
response.reset(); //页面不缓存,清空buffer
response.setCharacterEncoding("utf-8"); //字符编码
response.setContentType("multipart/form-data");//二进制传输数据
//URLEncoder.encode(fileName,"utf-8")对中文进行编码否则会乱码
response.setHeader("Content-disposition", "attachment;filename="+ URLEncoder.encode(filename,"utf-8"));
FileInputStream fis = new FileInputStream(new File(uploadPath,filename));
ServletOutputStream os = response.getOutputStream();
int len = 0;
byte[] bytes = new byte[1024];
while ((len=fis.read(bytes))!=-1){
os.write(bytes,0,len);
}
os.close();
fis.close();
model.addAttribute("msg",filename+"下载成功");
return "result3";
}

