日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

014_下载乱码处理

發布時間:2025/4/17 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_下载乱码处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。