一、首先编写文件下载的前端页面
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文件下载页面</title>
</head>
<body>
<h3>手动编码方式下载</h3>
<a href="/day29_HttpServletRequest_81/DownLoadServlet?filename=document.zip">document.zip</a><br>
<a href="/day29_HttpServletRequest_81/DownLoadServlet?filename=DownloadServlet.java">DownloadServlet.java</a><br>
<a href="/day29_HttpServletRequest_81/DownLoadServlet?filename=feiji03.gif">feiji03.gif</a><br>
<a href="/day29_HttpServletRequest_81/DownLoadServlet?filename=飞机03.gif">飞机03.gif</a><br>
</body>
</html>
每一次点击下载,都会进入到DownLoadServlet中进行下载处理。
二、编写DownLoadServlet
package com.itheima.Servlet;
import com.itheima.utils.DownLoadUtils;
import sun.misc.IOUtils;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/*文件下载*/
@WebServlet(name = "DownLoadServlet", urlPatterns = "/DownLoadServlet")
public class DownLoadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
/*文件下载的核心:两个头,两个流*/
/*准备工作*/
//1、获得ServletContext对象
ServletContext context= this.getServletContext();
//2、获得文件名称,获得请求参数,确定请求下载的文件
String filename=request.getParameter("filename");
//3、获得文件的MIME类型
String mimeType=context.getMimeType(filename);
//4、获得文件的真实路径
String realPath=context.getRealPath("/download/"+filename);
/*设置两个头*/
//5、设置Content-Type头
response.setHeader("Content-Type",mimeType );
//11.获得请求头User-Agent(针对不同的浏览器进行乱码处理)
String header=request.getHeader("User-Agent");
//12.处理不同浏览器的中文乱码问题
filename= DownLoadUtils.getName(header,filename);
//6、设置Content-Disposition头(告诉浏览器无论如何都要弹出一个文件下载框)
response.addHeader("Content-Disposition","attachment;filename="+filename );
/*设置两个流*/
//7、创建一个输入流(多态)
InputStream is=new FileInputStream(realPath);
//8、获得一个输出流(多态)
OutputStream os=response.getOutputStream();
//9、流拷贝
org.apache.commons.io.IOUtils.copy(is, os);
//10、释放资源
is.close();
os.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException {
doGet(request, response);
}
}
三、解决中文乱码的问题DownLoadUtils
package com.itheima.utils;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import sun.misc.BASE64Encoder;
public class DownLoadUtils {
public static String getName(String agent, String filename) throws UnsupportedEncodingException {
if (agent.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}
}
四、实验结果