1. 程式人生 > >Servlet下載中出現中文亂碼以及檔名不全的解決方法

Servlet下載中出現中文亂碼以及檔名不全的解決方法

出現這個問題的主要原因就是不同瀏覽器提供的解析編碼不同

IE和谷歌用的是URL編碼,而火狐用的是Base64編碼

解決問題的方法就是根據不同的瀏覽器設定響應的編碼

// 先從request中獲取瀏覽器的資訊

String agent = request.getHeader("User-Agent");

// 判斷是什麼瀏覽器
if(agent.contains("Firefox")){
    // 如果是火狐瀏覽器,使用Base64編碼
    filename = DownloadUtil.base64EncodeFileName(filename);
 }else{
      // IE或者谷歌的瀏覽器 URL編碼
     filename = URLEncoder.encode(filename, "UTF-8");
     // 在IE瀏覽器下載時會出現空格變成 + 的問題,所以這裡把空+編碼成空格
     filename = filename.replace("+", " ");

 }

由於火狐瀏覽器的解析比較繁瑣,所以將解析放在一個方法裡,使用者直接呼叫即可

import sun.misc.BASE64Encoder;

public class DownloadUtil {
    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);
        }
    }
}

注意:直接複製方法可能會出現導包不成功

解決方法:在 jre目錄下找到rt.jar包,匯入專案lib目錄即可

jar包路徑:Java\jre8\lib\rt.jar