您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息