18
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

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

書き出すと長くなるので要点のみ。
また例に漏れず試行錯誤の混乱中に書いているので要注意。

失敗時は大抵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側は無視される。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
18
Help us understand the problem. What are the problem?