読者です 読者をやめる 読者になる 読者になる

この日記は私的なものであり所属会社の見解とは無関係です。 GitHub: takahashikzn

続・ファイル名に半角スペースを含むファイルダウンロード

ちょっと前にコチラで説明したお話。
http://d.hatena.ne.jp/takahashikzn/20100824/


最近コメント頂いたのですが、ファイル名を生のShift_JISデータでContent-Dispositionに入れる場合、『半角スペースが"_"に変わる』とのこと。


で、たった今調べてみたのですが、確かにそうなります。
おっかしいなぁ…当時はちゃんと検証したつもりだったんだけど。


IE8, Firefox3.6, Chrome7でそれぞれ、
"Content-Disposition; filename=???"に何を入れたらどうなるかを調査してみました。

  1. Firefox
    • filename="ほげ もげ.txt" → "ほげ もげ.txt"
    • × filename=ほげ もげ.txt → "ほげ" (半角スペース以降が切れる)
    • filename*=utf-8'ja'%XX%XX....txt (UTF-8でURLエンコード) → "ほげ もげ.txt"
  2. IE8
    • filename="ほげ もげ.txt" → "ほげ_もげ.txt"
    • filename=ほげ もげ.txt → "ほげ_もげ.txt"
    • × filename*=utf-8'ja'%XX%XX....txt (UTF-8でURLエンコード) → XXX.txt (※)
  3. Chrome
    • filename="ほげ もげ.txt" → "ほげ もげ.txt"
    • filename=ほげ もげ.txt → "ほげ もげ.txt"
    • × filename*=utf-8'ja'%XX%XX....txt (UTF-8でURLエンコード) → (IEと同じ結果)

"URLのファイル名+拡張子"になります。例えばダウンロードのURLが"/aaa/bbb/ccc"ならばファイル名は"ccc.txt"です。予想ですが拡張子はMIMEタイプを判定して自動的に付けているのではないかと。


上記の結果を見るに、どうやらIEだけが悪い子みたいです。


filenameの値に生Shift-JISデータを入れていたとしても、半角スペースは半角スペースのまま入っている。
だからこれ以上手の打ちようがないと思うんだけどなぁ。

今のところの結論

IEで、何としてでも半角スペースを含むファイル名でダウンロードさせたい場合、

  1. ファイル名をUTF-8でURLエンコードしたものを指定(URLEncoder.encodeを使う)
  2. 半角スペースが"_"になるのは仕様。あきらめる。(←僕はこっちを選びましたw)