public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取下载文件名称
String filename = request.getParameter("filename");
// 中文乱码问题
filename = new String(filename.getBytes("ISO8859-1"), "UTF-8");
// 获取请求头
String agent = request.getHeader("User-Agent");
String filenameEnconding = "";
// 根据不同的浏览器进行编码(模板代码)
if (agent.contains("MSIE")) {
// IE浏览器
filenameEnconding = URLEncoder.encode(filename, "utf-8");
filenameEnconding = filenameEnconding.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
filenameEnconding = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
filenameEnconding = URLEncoder.encode(filename, "utf-8");
}
// 要下载的文件类型 --客户端通过文件的MIME类型区分文件类型
response.setContentType(this.getServletContext().getMimeType(filename));
// 告诉客户端文件不可以直接解析,需要下载
response.setHeader("Content-Disposition", "attachment;filename=" + filenameEnconding);
// 获取文件绝对路径
String path = this.getServletContext().getRealPath("download/" + filename);
// 创建输入流
InputStream in = new FileInputStream(path);
// 获取输出流 通过response获取
ServletOutputStream out = response.getOutputStream();
int len = 0;
byte[] b = new byte[1024];
while ((len = in.read(b)) != -1) {
// 将字节数组写给客户端
out.write(b, 0, len);
}
// 释放资源
in.close();
}
<title>下载页</title>
</head>
<body>
<h1>使用A标签直接指向服务器上的资源提供下载功能</h1>
<a href="/web01/download/aaa.txt">aaa.txt</a>
<a href="/web01/download/dameinv.jpg">dameinv.jpg</a>
<a href="/web01/download/dameinv.zip">dameinv.zip</a>
<h1>使用服务器编码端实现文件下载</h1>
<a href="/web01/download?filename=aaa.txt">aaa.txt</a>
<a href="/web01/download?filename=dameinv.jpg">dameinv.jpg</a>
<a href="/web01/download?filename=dameinv.zip">dameinv.zip</a>
<a href="/web01/download?filename=反射.txt">反射.txt</a>
</body>
</html>