文件的下载
情景:在一些网络系统中,需要隐藏下载文件的真实地址,或者下载的文件需要一个程序来动态的确定后在传送给客户端
方案:利用程序编码实现下载
可以增加安全访问控制,只对经过授权认证的用户提供下载
可以从任意位置提供下载的数据
利用程序实现下载需要设置 2 个报头:
Web 服务器需要告诉浏览器其所输出的内容的类型不是普通的文本文件或 HTML 文件,而是一个要保存到本地的下载文件。设置Content-Type 的值为:application/x-msdownload
Web 服务器希望浏览器不直接处理相应的实体内容,而是由用户选择将相应的实体内容保存到一个文件中,这需要设置 Content-Disposition 报头。该报头指定了接收程序处理数据内容的方式,在 HTTP 应用中只有 attachment 是标准方式,attachment 表示要求用户干预。在 attachment 后面还可以指定 filename 参数,该参数是服务器建议浏览器将实体内容保存到文件中的文件名称。在设置 Content-Dispostion 之前一定要指定 Content-Type.
response.setContentType("application/x-msdownload"); String fileName = "data.pdf"; response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
因为要下载的文件可以是各种类型的文件,所以要将文件传送给客户端,其相应内容应该被当做二进制来处理,所以应该调用response.getOutputStream()方法返回 ServeltOutputStream 对象来向客户端写入文件内容。
OutputStream out = response.getOutputStream(); InputStream in = getServletContext().getResourceAsStream("/download/data.pdf"); byte [] buffer = new byte[1024]; int len = 0; while((len = in.read(buffer)) != -1){ out.write(buffer, 0, len); } in.close();
示例
三种方式:
1. 静态下载
2. jsp 动态下载
3. servlet 动态下载
文件目录:
src
| - org.rabbitx.web.javaweb.download
| - DownloadServlet
WebContent
| - download
| - download.jsp
| - test.jsp
| - data.pdf
| - WEB-INF
| - web.xml
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Download Demo</title> </head> <body> <!-- 静态下载 --> <a href="data.pdf">Download[Tag A]</a><br> <!-- jsp 动态下载 --> <a href="test.jsp">Download[Jsp]</a><br> <!-- servlet 动态下载 --> <a href="${pageContext.request.contextPath}/servlet/download">Download[Servlet]</a><br> </body> </html>
<%@page import="java.util.Date"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Test Page</title> </head> <body> <!-- 以下载的方式获取本页面内容,把本页面内容生成后,以下载文件的方式提供给用户 --> <h4>Test Page</h4> Time: <%= new Date() %> <% //1. 通知客户端浏览器: 这是一个需要下载的文件, 不能再按普通的 html 的方式打开. // 即设置一个响应的类型: application/x-msdownload response.setContentType("application/x-msdownload"); //2. 通知客户端浏览器: 不再由浏览器来处理该文件, 而是交由用户自行处理 // 设置用户处理的方式: 响应头: Content-Disposition response.setHeader("Content-Disposition", "attachment;filename=test.jsp.txt"); %> </body> </html>
package org.rabbitx.web.javaweb.download; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class DownloadServlet extends HttpServlet { private static final long serialVersionUID = -2017813047026703175L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("application/x-msdownload"); String fileName = "data.pdf"; response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); OutputStream out = response.getOutputStream(); InputStream in = getServletContext().getResourceAsStream("/download/data.pdf"); byte [] buffer = new byte[1024]; int len = 0; while((len = in.read(buffer)) != -1){ out.write(buffer, 0, len); } in.close(); //out由容器管理,不需要关闭 } }
<servlet> <servlet-name>downloadServlet</servlet-name> <servlet-class>org.rabbitx.web.javaweb.download.DownloadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>downloadServlet</servlet-name> <url-pattern>/servlet/download</url-pattern> </servlet-mapping>
测试:http://localhost:8080/org.rabbitx.web.javaweb/download/download.jsp
相关推荐
简单的实现下载,可以通过文件的下载功能满足日常任务的需要。
javaweb文件上传与下载
里面有html,JavaScript,css,jsp,xml,Tomcat相关的帮助文档。
javaweb文件上传与下载模块源代码 详见内部说明书 适合于初学者,JAVA程序员收藏
java web文件上传与下载,实现基本功能供初学者学习使用
JAVAWEB批量文件下载器,实现文件批量下载,队列方式,一个下载完成,再下载另一个。
javaweb简单实现文件上传与下载源代码,仅供参考
javaweb 程序填空题
javaWeb实现文件的上传和下载(可以返回上一级目录)
JSP+servlet+javabean学习 里面有PDF文件对该章节的详细讲解,培训老师才讲的到的,非常详细......资源内容如下: JavaWeb02-request与response.rar ...JavaWeb12-文件上传.rar JavaWeb13-过滤器与监听器.rar
JavaWeb帮助文档【完整帮助文档包含三层框架】........
javaweb开发帮助文档 ,有关于html ,javaee的帮助文档,有点杂。
javaweb开发工具说明、第二步 Javaweb目录结构、第三步 Javaweb项目部署、第四步 Javaweb开发之HTTP协议、第五步 javaweb开发之Servlet
JavaWeb实现文件上传下载功能实例解析 JavaWeb实现文件上传下载功能实例解析
基于javaweb的图书管理系统源码+数据库文件.zip 95分以上高分课程设计,代码完整,下载即用。 基于javaweb的图书管理系统源码+数据库文件.zip 95分以上高分课程设计,代码完整,下载即用。基于javaweb的图书管理...
JavaWeb常用帮助文档,里面包含各种帮助文档,JavaSE,JavaEE,三大框架,数据库,W3C等
java开发所需文档,有JavaScript,Html,CSS,Hibernate,Spring,Struts2,MySQL,JDK等文档
JavaWeb开发常见的API 文档,包括JDKAPI,MySql中文参考手册,W3CSchool全套开发手册,以及JQueryAPI,文档都是中文版的
课堂讲义: 从运行结果可以看到,我们的文件下载功能已经可以正常下载文件了。 关于JavaWeb中的文件上传和下载功能的内容就这么多。