java實現瀏覽器下載附件時檔名中文亂碼解決方案

Evan1024發表於2024-03-08

方案一:URLEncoder 解決 IE 和 谷歌瀏覽器的附件中文名問題。
如果客戶端瀏覽器是 IE 瀏覽器 或者 是谷歌瀏覽器。我們需要使用 URLEncoder 類先對中文名進行 UTF-8 的編碼 操作。 因為 IE 瀏覽器和谷歌瀏覽器收到含有編碼後的字串後會以 UTF-8 字符集進行解碼顯示。

// 把中文名進行 UTF-8 編碼操作。
String str = "attachment; fileName=" + URLEncoder.encode("中文.jpg", "UTF-8");
// 然後把編碼後的字串設定到響應頭中
response.setHeader("Content-Disposition", str);

方案二:BASE64 編解碼解決火狐瀏覽器的附件中文名問題
如果客戶端瀏覽器是火狐瀏覽器。 那麼我們需要對中文名進行 BASE64 的編碼操作。
因為火狐使用的是 BASE64 的編解碼方式還原響應中的漢字。所以需要使用 BASE64Encoder 類進行編碼操作。

// 使用下面的格式進行 BASE64 編碼後
String str = "attachment; fileName=" + "=?utf-8?B?"
+ new BASE64Encoder().encode("中文.jpg".getBytes("utf-8")) + "?=";
// 設定到響應頭中
response.setHeader("Content-Disposition", str);

方式三(推薦):透過判斷請求頭中 User-Agent 這個請求頭攜帶過來的瀏覽器資訊即可判斷出是什麼瀏覽器,來解決不同編解碼方式。

String ua = request.getHeader("User-Agent");
// 判斷是否是火狐瀏覽器
if (ua.contains("Firefox")) {
    // 使用下面的格式進行 BASE64 編碼後
    String str = "attachment; fileName=" + "=?utf-8?B?"
        + new BASE64Encoder().encode("中文.jpg".getBytes("utf-8")) + "?=";
    // 設定到響應頭中
    response.setHeader("Content-Disposition", str);
} else {
    // 把中文名進行 UTF-8 編碼操作。
    String str = "attachment; fileName=" + URLEncoder.encode("中文.jpg", "UTF-8");
    // 然後把編碼後的字串設定到響應頭中
    response.setHeader("Content-Disposition", str);
}

相關文章