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