文件的下载
情景:在一些网络系统中,需要隐藏下载文件的真实地址,或者下载的文件需要一个程序来动态的确定后在传送给客户端
方案:利用程序编码实现下载
可以增加安全访问控制,只对经过授权认证的用户提供下载
可以从任意位置提供下载的数据
利用程序实现下载需要设置 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文件上传与下载
这个"javaweb文件上传与下载模块源代码"提供了一个实现这些功能的基础框架,对于初学者和Java程序员来说,这是一个很好的学习资源。下面将详细讲解其中涉及的关键知识点。 1. **Servlet和HTTP协议**: - 在Java ...
JavaWeb批量文件下载器是一种基于Java技术开发的Web应用程序,主要功能是允许用户批量地、有序地下载文件。这种工具通常适用于需要集中管理和分发大量文件的场景,比如教育机构的课件分享、企业的内部资料分发或者...
在JavaWeb开发中,文件上传和下载是常见的功能需求,特别是在构建交互性强的Web应用时。本源代码示例提供了一个简单的实现,帮助开发者理解如何处理这些操作。下面将详细解释涉及的技术点。 1. **文件上传** - **...
这份"JavaWeb开发文档集合"显然是一份宝贵的资源,包含了多种核心技术的指南,可以帮助开发者深入理解和掌握JavaWeb开发的各个环节。 首先,JavaScript、HTML和CSS是构建网页前端的基本技术。JavaScript是一种运行...
本帮助文档全面介绍了JavaWeb开发中的核心概念和实践技巧,特别是强调了采用三层架构的设计模式。 首先,JavaWeb的核心技术包括Servlet、JSP(JavaServer Pages)和JavaBean。Servlet是Java语言编写的应用程序,它...
第三步,JavaWeb项目部署:部署JavaWeb应用通常涉及将项目打包成WAR(Web ARchive)文件,然后将其放在应用服务器的webapps目录下。Tomcat会自动解压并启动应用。部署过程还包括配置服务器端的环境变量、虚拟主机和...
这个"javaWeb实现文件的上传和下载(可以返回上一级目录)"项目,旨在提供一个用户友好的交互式文件管理系统,允许用户不仅能够上传和下载文件,还能方便地浏览文件目录,包括返回上一级目录的功能。下面我们将详细...
了解如何配置Tomcat服务器、部署WAR文件、管理应用以及日志查看,对于JavaWeb开发者来说是基础技能。 这些技术的综合运用使得JavaWeb开发者能够创建功能丰富、交互性强的Web应用。在阅读提供的“JavaWeb帮助文档Api...
javaweb 程序填空题
JSP+servlet+javabean学习 里面有PDF文件对该章节的详细讲解,培训老师才讲的到的,非常详细......资源内容如下: JavaWeb02-request与response.rar ...JavaWeb12-文件上传.rar JavaWeb13-过滤器与监听器.rar
附件中的"web.doc"文件可能是作者自己编写的关于JavaWeb的详细文档,包含了可能的实战经验、代码示例或者对上述概念的深入解释。下载并阅读该文档,将有助于进一步理解和掌握JavaWeb开发的关键技术。 总之,JavaWeb...
JavaWeb学习教程文档是一套全面且深入的教育资源,旨在引导初学者逐步掌握Web开发的核心技术。这个教程首先从最基础的前端技术讲起,包括HTML5、CSS和JavaScript,然后过渡到后端的XML和Servlet等内容,使得学习者...
Spring formwork.chm是Spring框架的帮助文档,Spring是JavaWeb中最受欢迎的框架之一,它提供了依赖注入、AOP(面向切面编程)、MVC等特性,有助于简化企业级应用的开发。 JSTL中文帮助文档CHM.chm介绍了JavaServer ...
JavaWeb技术是构建互联网应用程序的重要框架,它将Java语言与Web技术相结合,为开发者提供了强大的..."javaweb书籍.pdf"这个文件可能包含了黄勇老师关于JavaWeb架构的详细讲解,对于初学者和进阶者都是宝贵的参考资料。
基于javaweb的图书管理系统源码+数据库文件.zip 95分以上高分课程设计,代码完整,下载即用。 基于javaweb的图书管理系统源码+数据库文件.zip 95分以上高分课程设计,代码完整,下载即用。基于javaweb的图书管理...
JavaWeb文件域包是开发JavaWeb应用程序时处理文件上传功能的重要工具。在Web应用中,用户经常需要上传图片、文档等文件,这时就需要借助特定的库来实现这一功能。"commons-fileupload-1.3.1.jar" 和 "commons-io-2.4...
1. 文档上传:用户可以通过Web界面上传文档,系统会对文件进行校验、编码转换等预处理,然后存储到服务器的指定目录或数据库中。 2. 检索功能:系统提供关键词搜索、全文检索等多种方式,帮助用户快速找到所需文档...
这不仅有助于理解JavaWeb开发中的文件下载,也有助于学习Apache POI库的使用。记得在实际项目中考虑性能优化,如分批处理大数据,避免一次性加载所有数据导致内存溢出。同时,注意错误处理,确保在异常情况下能提供...