2010年4月14日

如何在下載動作中正確顯示中文檔名?

總而言之,除了為人垢病的 CSS 問題外,各家瀏覽器在下載中文檔名時也有各自的脾氣...

以下是 JAVA 程式碼範例,大致上就分成兩派:支援 RFC-2231 的 Firefox/Opera 系和不支援的 IE /Webkit 系兩種,在 Test Cases for HTTP Content-Disposition header and RFC 2231/2047 Encoding 網站中有對各家瀏覽器是否支援 RFC-2231 規範的測試記錄,就結果來看除了純 ASCII 編碼的檔名頗受大家都支援外 (?),其他混雜有各地語言的檔案名稱就得依瀏覽器的派別個別處理了。

if ( StringUtils.contains( userAgent, "MSIE" ) || StringUtils.containsIgnoreCase( userAgent, "AppleWebKit" ) ) {
    res.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode( fileName, "UTF-8" ) + "\"");
} else {
    res.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + URLEncoder.encode( fileName, "UTF-8" ) );
}

就目前測試結果得知:

  1. IE 6:可以正確彈出下載視窗,但存檔時的不一定能顯示正確的中文檔名
  2. IE 7/8:可以正確彈出下載視窗及中文檔名
  3. Chromium 5.0.360.5 / Chrome 5.0.375.3 dev:可以正確彈出下載視窗及中文檔名,其 AppleWebKit 核心版本分別為 533.3 及 533.4
  4. Safari 4.0.5:在 AppleWebKit/531.22.7 時兩種方式都不行,但因 Chrome 的經驗猜測更新 AppleWebKit 到 5.33 以後版本即可正確顯示中文檔名
  5. Firefox 3.x:可以正確彈出下載視窗及中文檔名
  6. Opera 10.51:可以正確彈出下載視窗及中文檔名

沒有留言:

張貼留言