Hatena::ブログ(Diary)

不会忘記的一天

2010-01-06

ファイルダウンロード処理において、レスポンスヘッダー Content-Disposition に attachment; filename=<ファイル名> に日本語を設定すると文字化けする

いろいろと回避方法があるようだが

Safariに関してはこの方法では文字化けは不可避らしい…

う〜ん困った…


回避方法

ブラウザ対応
IE6,7,8URLエンコーディングで回避できる(java.net.URLEncoder#encode() を使用する)
FireFox3.5MIME-Bエンコーディングで回避できる(javax.mail.MimeUtility#encodeWord() を使用する)
Chrome4.0[FireFox]と同じ
Safariどう足掻いても化けるので、サニタイジングを行うなどの処理が必要

実装

このような条件でファイル名を変換

User-Agentの条件をもっと細かく見る必要があるかもしれない(?)

// User-Agent取得
String agent = request.getHeader("User-Agent").toUpperCase();
if(agent.indexOf("MSIE") > -1) {
    // Internet Explorer
    fileName = URLEncoder.encode(fileName, "UTF-8");

} else if(agent.indexOf("FIREFOX") > -1 || agent.indexOf("CHROME") > -1){
    // FireFox, Google Chrome
    fileName = MimeUtility.encodeWord(fileName, "ISO-2022-JP", "B");

} else if(agent.indexOf("SAFARI") > -1) {
    // Safari
    // 日本語(例えばASCII文字以外)をサニタイズする処理を挟む
    fileName = sanitizeForSafari(fileName);

} else {
    // その他
}

return fileName;

参照サイト

Safari文字化けを回避する対応が載っているリンクを貼っておきます


日本語ファイル名の書き出し(Safari対策) - Chewing GUM! - Seesaa Wiki(ウィキ)

日本語ファイル名


いずれもリクエストパラメータを変更する必要があるっぽい

これを参考に、リダイレクトすればそれっぽくできそうだけど?

それにはサーバ側の口も必要なワケで…

う〜ん…まいった…

zerodzerod 2011/03/09 10:56 ありがとうございます助かりました

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/guangda/20100106/1262762061