2010年7月21日水曜日

ファイルダウンロードダイアログの日本語ファイル名クロスブラウザ対応

はまったのでメモ

ファイルダウンロードダイアログでブラウザによってファイル名の設定方法が統一されていない。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 件のコメント:

コメントを投稿