1 准备需要下载的文件资源 在WebContent目录下新建一个download文件将资源放入
2 在WebContent目录下面新建一个html页面 发送一个带参数的get请求到servlet
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="Download?filename=测试文件.jpg">测试文件.jpg</a>
</body>
</html>
3 创建一个名字叫Download的servlet 在doGet方法里面对请求进行处理
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;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 sun.misc.BASE64Encoder;
@WebServlet("/Download")
public class Download extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1.获取要下载文件的名字
String fileName = request.getParameter("filename");// 2.将中文字符进行转码
fileName = new String(fileName.getBytes("utf-8"), "utf-8");// 3.获取这个文件在tomacat里的绝对路径
String path = getServletContext().getRealPath("download/" + fileName);
System.out.println(fileName);// 4.如果文件的名字带有中文,那么需要对这个文件名进行编码处理 不然下载时浏览器不会显示名字
// 4.1获取来访客户端的类型
String clientType = request.getHeader("User-Agent");
// 4.1.1 对火狐浏览器的处理
if (clientType.contains("Firefox")) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
fileName = "=?UTF-8?B?" + new String(base64Encoder.encode(fileName.getBytes("UTF-8"))) + "?=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
} else {
// 4.1.2 针对IE或谷歌
fileName = URLEncoder.encode(fileName, "UTF-8");
}// 5.让浏览器接收到这份资源的时候,以下载的方式提醒用户,而不是直接展示
response.setHeader("Content-Disposition", "attachement;filename=" + fileName);// 6.转换成流
InputStream is = new FileInputStream(path);
OutputStream os = response.getOutputStream();// 7.写出数据
int len = 0;
byte[] buffer = new byte[1024];
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
}// 8.关闭流
os.close();
is.close();}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}}