014_下载乱码处理
生活随笔
收集整理的這篇文章主要介紹了
014_下载乱码处理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一. 中文文件下載
1. 新建一個DownloadLuanMa的Web工程
2. 在WebContent下新建一個Download目錄, 下面放一個中文文件
3. 新建一個index.html
4. 編寫index.html
5. 新建一個DownloadLuanMa.java類
6. 編寫DownloadLuanMa.java
package com.lywgames.myservlet;import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class DownloadLuanMa extends HttpServlet {private static final long serialVersionUID = 1L;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 獲取文件名字String filename = new String(req.getParameter("filename").getBytes("ISO8859-1"), "UTF-8");// 讓瀏覽器收到這份資源的時候, 以下載的方式提醒用戶, 而不是直接展示。 resp.setHeader("Content-Disposition", "attachment; filename="+filename);// 獲取這個文件在Tomcat里面的絕對路徑地址String path = getServletContext().getRealPath("Download/" + filename);InputStream is = new FileInputStream(path);OutputStream os = resp.getOutputStream();int len = 0 ;byte[] buffer = new byte[1024];while((len = is.read(buffer)) != -1){os.write(buffer, 0, len);}os.close();is.close();}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);} }5. 編寫web.xml
6. 部署訪問
二. 解決中文亂碼
1. 瀏覽器接受到我們的中文文件名字, 會進行一次URLDecoder的解碼, 因此我們在返回文件名字的時候需要一次URLEncoder的編碼。
2. 如果是IE或者Chrome, 使用的是URLDecoder的解碼方式。 如果是Firefox, ?使用Base64的解碼方式。因此我們在返回文件名字的時候需要針對瀏覽器類型, 給中文文件名字進行URLEncoder或者BASE64Encoder的編碼。
3. 修改我們的DownloadLuanMa.java
package com.lywgames.myservlet;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.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import sun.misc.BASE64Encoder;public class DownloadLuanMa extends HttpServlet {private static final long serialVersionUID = 1L;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);}}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 獲取文件名字String filename = new String(req.getParameter("filename").getBytes("ISO8859-1"), "UTF-8");// 獲取來訪的客戶端類型String clientType = req.getHeader("User-Agent");System.out.println(clientType + "\r\n" + base64EncodeFileName(filename));// 讓瀏覽器收到這份資源的時候, 以下載的方式提醒用戶, 而不是直接展示。 if(clientType.contains("Firefox")){resp.setHeader("Content-Disposition", "attachment; filename="+base64EncodeFileName(filename));}else{resp.setHeader("Content-Disposition", "attachment; filename="+URLEncoder.encode(filename, "UTF-8"));}// 獲取這個文件在Tomcat里面的絕對路徑地址String path = getServletContext().getRealPath("Download/" + filename);InputStream is = new FileInputStream(path);OutputStream os = resp.getOutputStream();int len = 0 ;byte[] buffer = new byte[1024];while((len = is.read(buffer)) != -1){os.write(buffer, 0, len);}os.close();is.close();}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);} }4. 部署運行, 使用IE瀏覽器下載, 中文名字顯示正常
5. 使用Chrome瀏覽器下載, 中文名字顯示正常
6. 使用Firefox瀏覽器下載, 中文名字顯示正常
總結
以上是生活随笔為你收集整理的014_下载乱码处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 013_下载静态资源
- 下一篇: 012_HttpServletRespo