出現這個問題的主要原因就是不同浏覽器提供的解析編碼不同
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