Servlet文件下载模板
2016-10-10 22:02
176 查看
Servlet文件下载模板
文件下载就是将服务器上已经存在的文件输出到浏览器。常见的文件下载方式
超链接的方式
直接将服务器上的文件的路径写到href属性中.如果浏览器不支持该格式文件,那么就会提示进行下载,如果浏览器支持这个格式的文件,那么直接打开。手动编码的方式
手动编写代码实现下载.无论浏览器是否识别该格式的文件,都会提示下载。既然文件下载就是将服务器上已经存在的文件输出到浏览器,那么要实现文件的下载,不仅需要指定文件的路径,还需要在HTTP协议中设置两个响应消息头:
设置的两个响应头
Content-Type:文件类型.(MIME的类型)response.setHeader(“Content-Type”, fileType);
Content-Disposition:浏览器识别该格式文件,提示下载.
response.addHeader(“Content-Disposition”, “attachment;filename=”+filename);
一旦设定了这两个响应消息头,浏览器通常会直接处理响应的实体内容,需要在HTTP响应消息中设置两个响应消息头字段,用来指定接收程序处理数据内容的方式为下载方式。当单击“下载”超链接时,系统将请求提交到对应的Servlet。在该Servlet中,首先获取下载文件的地址,并根据该地址创建文件字节输入流,然后通过该流读取下载文件内容,最后将读取的内容通过输出流写到目标文件中。
模板
Download页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>DownLoad</title> </head> <body> <h2>直接指向路径下载</h2> <%-- 直接指向路径下载会将中文进行编码,所以下载不会指向正确的中文路径,可以通过将路径修改为英文进行修复 --%> <a href="download/飞机.gif">飞机.gif</a><br/> <%-- 但是可以发现,如果这种类型是浏览器能够识别的类型,那么将不会启动下载器,而是直接显示文件 --%> <a href="download/Book.pdf">Book.pdf</a><br/> <%-- 不能识别,则会显示下载器 --%> <a href="download/java_ee_api.chm">java_ee_api.chm</a><br/> <h2>Servlet实现下载</h2> <%-- get方式中文使用的是ios-8859-1编码 --%> <a href="DownloadServlet?fileName=飞机.gif">飞机.gif</a><br/> <a href="DownloadServlet?fileName=Book.pdf">Book.pdf</a><br/> <a href="DownloadServlet?fileName=java_ee_api.chm">java_ee_api.chm</a><br/> </body> </html>
DownloadServlet
package com.pc.download; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import sun.misc.BASE64Encoder; public class DownloadServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); // 获取参数 String fileName = request.getParameter("fileName"); // 对文件名进行转码,从iso-8859-1->utf-8 fileName = new String(fileName.getBytes("iso-8859-1"), "utf-8"); // 获取文件类型 String fileType = request.getServletContext().getMimeType(fileName); // 获取文件所在真实路径 String realPath = request.getServletContext().getRealPath("download/" + fileName); // 解决下载页面中文问题 String userAgent = request.getHeader("User-Agent"); // 火狐浏览器采用Base64编码 if(userAgent.contains("Firefox")) { fileName = base64EncodeFileName(fileName); } else { fileName = URLEncoder.encode(fileName, "utf-8"); } // 设置下载所需响应头 // 设置文件mine类型 response.addHeader("Content-Type", fileType); // 设置文件下载 response.addHeader("Content-Disposition", "attachment;filename= " + fileName); // 创建文件字节流 FileInputStream fis = new FileInputStream(realPath); OutputStream fos = response.getOutputStream(); // 缓冲数组 byte[] buf = new byte[4096]; int len = 0; while((len = fis.read(buf)) != -1) { fos.write(buf, 0, len); } // 关闭文件流(response的文件流由容器管理,不需要关闭) fis.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } // 火狐浏览器编码问题 public static String base64EncodeFileName(String fileName) { BASE64Encoder base64Encoder = new BASE64Encoder(); try { return "=?UTF-8?B?" + new String(base64Encoder.encode(fileName.getBytes("UTF-8"))) + "?="; } catch (UnsupportedEncodingException e) { e.printStackTrace(); throw new RuntimeException(e); } } }
配置web.xml
<servlet> <servlet-name>DownloadServlet</servlet-name> <servlet-class>com.pc.download.DownloadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>DownloadServlet</servlet-name> <url-pattern>/DownloadServlet</url-pattern> </servlet-mapping>
PS:GitHub:https://github.com/Switch-vov/servlet-tools
相关文章推荐
- 用servlet写的在浏览器下载文件模板
- OA开发中下载模板文件的方法之xml篇
- [Servlet] 实现文件下载
- 文件上传(servlet 中含下载和删除操作)
- 用SmartUpload实现文件的上传下载(在servlet中实现)
- 使文件下载的自定义连接支持 FlashGet 的断点续传多线程链接下载! JSP/Servlet 实现!
- 如何使 FlashGet "正常合法" 下载 Session 中的自定义文件链接呢? JSP/Servlet 实现!
- 使文件下载的自定义连接支持 FlashGet 的断点续传多线程链接下载! JSP/Servlet 实现!
- [WinForm每日一帖] 如何使用资源文件提供Excel模板下载
- SERVLET与JSP_文件上传下载(4)-java
- 一个文件下载的Servlet
- servlet实现文件下载
- 使用Servlet实现动态文件下载
- Servlet下载文件
- Servlet实现文件下载
- 如何使 FlashGet "正常合法" 下载 Session 中的自定义文件链接呢? JSP/Servlet 实现!
- 一个文件下载的Servlet
- servlet+Hibernate文件下载组件
- 转载tangl_99的Servlet 实现文件上传下载--自己的一点心得
- 一个项目中调用另外一个项目中下载文件的servlet来下载本项目中的资源