37
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-10-30

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

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

37
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
37
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?