文件下载
Servlet文件下载
- 文件只要不是放在WEB-INF目录下,浏览器输入路径可以正确下载
- 如果需要权限控制,文件放在WEB-INF目录下
- 指定响应内容类型
- 使用Response.getOutputStream获取ServletOutputStream把文件响应给浏览器
ServletOutputStream
直接对浏览器进行字节输出,需要使用HttpServletResponse的getOutputStream()方法取得ServletOutputStream实例,它是OutputStream的子类。
example
- 功能
你也许会希望有个功能,用户必须输入正确的密码,才可以下载服务器的PDF电子书。
- 实现
1、为了不让浏览器直接请求PDF文件,因此在这里将PDF文件放在WEB-INF目录中。
2、由于会对浏览器写出二进制串流,浏览器必须知道如何正确处理收到的字节数据,所以须设置内容类型为application/pdf。
3、使用HttpServlet的getServletContext()取得ServletContext对象。使用ServletContext的getResourceAsStream()方法以串流程序读取文件,指定的路径要是相对于Web应用程序环境根目录。
4、通过HttpServletResponse的getOutputStream()来取得ServletOutputStream对象,用ServletOutputStream来对浏览器进行写出响应。
- 代码(使用谷歌浏览器下载一切正常,使用火狐浏览器下载文件名中文字符会出现乱码)
package com.test; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; /** * 测试地址: 127.0.0.1:8090/hello/download?password=123456 */ @WebServlet("/download") public class DownLoad extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String password = request.getParameter("password"); if ("123456".equals(password)) { // 使用 UTF8 编码文件名 String filename = java.net.URLEncoder.encode("深入剖析Tomcat.pdf","UTF-8"); // 设置响应内容类型及编码方式 response.setContentType("application/pdf; charset=UTF-8"); response.setHeader("Cache-Control", "max-age=0"); // 输出到客户端的文件名要使用setHeader来设置 response.setHeader("Content-disposition", "attachment; filename=" + filename); // 事先在/WEB-INF文件夹下放入一个pdf文件 InputStream inputStream = getServletContext().getResourceAsStream("/WEB-INF/深入剖析Tomcat.pdf"); ServletOutputStream outputStream = response.getOutputStream(); byte[] buffer = new byte[1024]; int length = -1; while ((length = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, length); } inputStream.close(); outputStream.close(); } } }