天天看點

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