下载中文文件乱码解决方式
关于编码的问题有几点需要说清楚:UTF-8国际编码,GBK中文编码。GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成立;英文文字就是26个字母,真正的对应关系就是ASCII码表中的关系,但是如何表示汉字呢?很显然也需要一套对应的码表,于是UTF-8、GBK、GB2312这些编码方式就是为了解决这个问题的。
下面看看正题:首先我的目录是:压缩包即是我要下载的文件
我的下载界面:
1<!DOCTYPE html>
2<html>
3<head>
4 <meta charset="UTF-8">
5 <title>Insert title here</title>
6</head>
7<body>
8 <h3> 使用a标签指向服务器资源 </h3>
9 <a href="/Web14_response/download/a.flv">a.flv</a><br>
10 <a href="/Web14_response/download/a.jpg">a.jpg</a><br>
11 <a href="/Web14_response/download/a.mp3">a.mp3</a><br>
12 <a href="/Web14_response/download/a.mp4">a.mp4</a><br>
13 <a href="/Web14_response/download/a.txt">a.txt</a><br>
14 <a href="/Web14_response/download/a.zip">a.zip</a><br>
15 <h3> 使用服务器代码完成服务器资源下载 </h3>
16 <a href="/Web14_response/DownloadServlet2?filename=a.flv">a.flv</a><br>
17 <a href="/Web14_response/DownloadServlet2?filename=a.jpg">a.jpg</a><br>
18 <a href="/Web14_response/DownloadServlet2?filename=a.mp3">a.mp3</a><br>
19 <a href="/Web14_response/DownloadServlet2?filename=a.mp4">a.mp4</a><br>
20 <a href="/Web14_response/DownloadServlet2?filename=a.txt">a.txt</a><br>
21 <a href="/Web14_response/DownloadServlet2?filename=压缩包.zip">压缩包.zip</a><br>
22</body>
23</html>
提供文件下载的Servlet:
1package com.xpu.content;
2
3import java.io.FileInputStream;
4import java.io.IOException;
5import java.io.InputStream;
6import java.net.URLEncoder;
7
8import javax.servlet.ServletException;
9import javax.servlet.ServletOutputStream;
10import javax.servlet.http.HttpServlet;
11import javax.servlet.http.HttpServletRequest;
12import javax.servlet.http.HttpServletResponse;
13
14import sun.misc.BASE64Encoder;
15
16public class DownloadServlet extends HttpServlet {
17
18 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
19 // 这个主要是下载中文的
20 // 获取要下载的文件的名称
21 String filename = request.getParameter("filename");
22 // 解决获得中文参数的乱码
23 filename = new String(filename.getBytes("ISO8859-1"), "UTF-8");
24 // 设置头信息
25 response.setContentType(getServletContext().getMimeType(filename));
26 String agent = request.getHeader("User-Agent");
27 String filenameEncoder = "";
28 if (agent.contains("MSIE")) {
29 // IE浏览器
30 filenameEncoder = URLEncoder.encode(filename, "utf-8");
31 filenameEncoder = filename.replace("+", " ");
32 } else if (agent.contains("Firefox")) {
33 // 火狐浏览器
34 BASE64Encoder base64Encoder = new BASE64Encoder();
35 filenameEncoder = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
36 } else {
37 // 其它浏览器
38 filenameEncoder = URLEncoder.encode(filename, "utf-8");
39 }
40
41 response.setHeader("Content-Disposition", "attachment;filename=" + filenameEncoder);
42 System.out.println(filename);
43 // 获取文件的绝对路径
44 String path = getServletContext().getRealPath("/download/" + filename);
45 // 获取该文件的输入流
46 InputStream is = new FileInputStream(path);
47 // 获取输出流
48 ServletOutputStream os = response.getOutputStream();
49 // 文件拷贝的模板代码
50 int len = 0;
51 byte[] bys = new byte[1024];
52 while ((len = is.read(bys)) != -1) {
53 os.write(bys, 0, len);
54 }
55 is.close();
56 }
57
58 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
59 doGet(request, response);
60 }
61}
下载效果: