Content-Disposition によるダウンロードファイル名の指定について

Content-Disposition ヘッダーによるダウンロード時のファイル名の指定について、色々調べたことをまとめます。

まずファイル名の指定方法には2種類あり、ブラウザによって対応状況が違います。

- attachment; filename="hogehoge.pdf"
- attachment; filename*=uti-8'ja'hogehoge.pdf

いずれも RFC 5987 に規定されている書き方に準拠しているので、両方とも正しいです。

IE の場合、IE9 は両方に対応していますが、IE6-8 は前者のみに対応しています。
Chrome (18.0) と Firefox (11.0) は両方に対応しています。Safari (5.1.5) は前者のみで、2バイト文字の取り扱いはできません。

ファイル名はパーセントエンコードする必要があります。パーセントエンコーディングについては、RFC 3986 で規定されています。HTMLのフォームからGET,POST した時にお目にかかるx-www-form-encoded エンコード方式に類似しているものですが、半角スペースを "%20" に変化するか "+" に変換するかの違い等があるので注意が必要です。

- 全ブラウザ
- 半角英数字はパーセントエンコーディングが不要
- 半角スペースは"%20"に。"+" への変換ではNG。
- 2バイト文字はパーセントエンコーディングが必要。
- 半角記号については、ブラウザによって差異がある。
- IE6-8, IE9 (attachment; filename="hogehoge.pdf"の場合)
-- "#" ";" "%" はパーセントエンコーディングが必要。
-- その他の半角記号はエンコーディング不要。
- Chrome (attachment; filename*=uti-8'ja'hogehoge.pdf; の場合)
-- "'" "," ";" "%" はパーセントエンコーディングが必要。
-- その他の半角記号はエンコーディング不要。
-- "(" ")" などデコードができないので、エンコーディングしてはいけない文字もある。
- Firefox (attachment; filename*=uti-8'ja'hogehoge.pdf の場合)
-- Chrome より賢いので、Chrome と同じで良い。

IE系とChromeおよび Firefox の2つで処理を分ければ良いです。