書き出すと長くなるので要点のみ。
また例に漏れず試行錯誤の混乱中に書いているので要注意。
失敗時は大抵URL末尾がファイル名になる。
日本語ファイルの文字化けつらひ。
Chrome 62
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*には関係がない。
OK
filename*=utf8''urlエンコードされたファイル名
IE11
NG
filename*=utf8''urlエンコードされたファイル名
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側は無視される。