ファイルダウンロードダイアログでブラウザによってファイル名の設定方法が統一されていない。asciiのみのファイル名ならなら問題ないが日本語の場合困ったことに。
色々調べた結果、以下の対応でOKぽい(IE8はやってない)
・IE6/IE7はUTF-8でURLエンコード
・Chrome/firefoxはISO-2022-JPでbase64エンコード
・opera/safariは全角スペース2ついれてISO-8859-1で復号化した文字列
Content-Dispositionのfilenameに以下のようなメソッドで取得したファイル名を設定
public static String getFilename(String filename) {
if (filename == null || "".equals(filename)) {
return "";
}
String displayName = null;
try {
if (isIE6() || isIE7()) {
// IE6 IE7はUTF-8でURLエンコード
displayName = URLEncoder.encode(filename, "UTF-8");
} else if (isChrome() || isFirefox()) {
// googlechrome firefox はISO-2022-JPでbase64エンコード
displayName = MimeUtility.encodeWord(filename, "ISO-2022-JP",
"B");
} else if (isSafari() || isOpera()) {
// opera safariはlatin1で
String encodedName = " " + filename;
displayName = new String(encodedName.getBytes(), "ISO-8859-1");
} else {
// サポート対象外はとりあえずISO-2022-JPでbase64エンコード
displayName = MimeUtility.encodeWord(filename, "ISO-2022-JP",
"B");
}
} catch (UnsupportedEncodingException e) {
// エラー処理
}
return displayName;
}
0 件のコメント:
コメントを投稿