在jsp页面中给出超链接,链接到DownloadServlet,并提供要下载的文件名称。然后DownloadServlet获取文件的真实路径,然后把文件写入到response.getOutputStream()流中。
download.jsp
<body>
This is my JSP page. <br>
<a href=http://www.likecs.com/"<c:url value=http://www.likecs.com/\'/DownloadServlet?path=a.avi\'/>">a.avi</a><br/>
<a href=http://www.likecs.com/"<c:url value=http://www.likecs.com/\'/DownloadServlet?path=a.jpg\'/>">a.jpg</a><br/>
<a href=http://www.likecs.com/"<c:url value=http://www.likecs.com/\'/DownloadServlet?path=a.txt\'/>">a.txt</a><br/>
</body>
DownloadServlet.java
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String filename = request.getParameter("path");
String filepath = this.getServletContext().getRealPath("/WEB-INF/uploads/" + filename);
File file = new File(filepath);
if(!file.exists()) {
response.getWriter().print("您要下载的文件不存在!");
return;
}
IOUtils.copy(new FileInputStream(file), response.getOutputStream());
}
上面代码有如下问题:
l 可以下载a.avi,但在下载框中的文件名称是DownloadServlet;
l 不能下载a.jpg和a.txt,而是在页面中显示它们。
3 通过Servlet下载2下面来处理上一例中的问题,让下载框中可以显示正确的文件名称,以及可以下载a.jpg和a.txt文件。
通过添加content-disposition头来处理上面问题。当设置了content-disposition头后,浏览器就会弹出下载框。
而且还可以通过content-disposition头来指定下载文件的名称!
String filename = request.getParameter("path");
String filepath = this.getServletContext().getRealPath("/WEB-INF/uploads/" + filename);
File file = new File(filepath);
if(!file.exists()) {
response.getWriter().print("您要下载的文件不存在!");
return;
}
response.addHeader("content-disposition", "attachment;filename=" + filename);
IOUtils.copy(new FileInputStream(file), response.getOutputStream());