被下载的资源必须放到WEB-INF目录下(只要用户不能通过浏览器直接访问就OK),然后通过Servlet完成下载。
在jsp页面中给出超链接,链接到DownloadServlet,并提供要下载的文件名称。然后DownloadServlet获取文件的真实路径,然后把文件写入到response.getOutputStream()流中。
download.jsp
<body>
<a href="<c:url value='/download/download1?path=论坛.png'/>">论坛.png</a>
<a href="<c:url value='/download/download1?path=龙猫.jpg'/>">龙猫.jpg</a>
</body>
DownloadServlet.java
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String filename = request.getParameter("path");
// GET请求中,参数中包含中文需要自己动手来转换。
// 当然如果你使用了“全局编码过滤器”,那么这里就不用处理了
//filename = new String(filename.getBytes("ISO-8859-1"), "UTF-8");
String filepath = this.getServletContext().getRealPath("/uploads/"+filename);
File file = new File(filepath);
if(!file.exists()) {
response.getWriter().print("您要下载的文件 不存在!");
return;
}
// 所有浏览器都会使用本地编码,即中文操作系统使用GBK
// 浏览器收到这个文件名后,会使用iso-8859-1来解码
filename = new String(filename.getBytes("GBK"), "ISO-8859-1");
response.addHeader("content-disposition", "attachment;filename=" + filename);
IOUtils.copy(new FileInputStream(file), response.getOutputStream());
}