Edited at

Content-Disposition: attachment; filenameのrfc 6266形式

More than 1 year has passed since last update.

書き出すと長くなるので要点のみ。

また例に漏れず試行錯誤の混乱中に書いているので要注意。

失敗時は大抵URL末尾がファイル名になる。

日本語ファイルの文字化けつらひ。


Chrome 62


:rage:NG

filename*="utf8''urlエンコードされたファイル名"

e-mailでもたまにある属性値をダブルクォーテーションで囲む形式。


追記

filename自体へのダブルクォーテーションは可のようだ。


Content-Disposition: INLINE; FILENAME= "an example.html"

Note: This uses the quoted-string form so that the space character

can be included.


引用符があるのでスペースを含めることができるが、URLエンコードするfilename*には関係がない。

RFC 6266 - Use of the Content-Disposition Header Field in the Hypertext Transfer Protocol (HTTP)#example


:smile:OK

filename*=utf8''urlエンコードされたファイル名


IE11


:rage:NG

filename*=utf8''urlエンコードされたファイル名


:smile:OK

filename*=utf-8''urlエンコードされたファイル名

大概のライブラリは表記ゆれを許容してくれるが、IEはダメだったみたい。

また、IEはRFC 6266対応がIE9からと

http://www.msng.info/archives/2014/04/internet-explorer-11-user-agant-change.php

にあったが、開発者ツールのドキュメントモードでバージョンを落とすだけでは再現はしない?(5に落としても成功)


Firefox

他でNGでも大抵うまくいくように見える。


併記方式

filename=hogehoge;filename*=utf8''urlエンコードされたファイル名

filename*=utf8''urlエンコードされたファイル名;filename=hogehoge;

これは各ブラウザfilename*=が優先されるようだ。

filename*=に対応していないブラウザがfilename=を参照してくれることを確認できれば併記方式が安全なのだが…

併記で行けそう

ダウンロードファイル名、文字化けとの格闘 - ねぎぶログ


結論:

ブラウザ判定のロジックを入れ込むことなく、 複数のブラウザにてダウンロードファイルの文字化けを避けたい場合は、 レスポンスヘッダに

Content-Disposition: attachment;

filename="ファイル名";
filename*=UTF-8''URLエンコーディン
グされたファイル名

上記のように設定しよう。 恐れることはない、filename*が有効なブラウザではfilename側は無視される。