ネットサーフィン(かなりの死語)してて、偶然見かけた話題について。
ブラウザで日本語名、というかマルチバイト文字(多バイト文字とも)を含んだファイル名でダウンロードするにはどうするのがいいのかという話題。
自分もかつて同様のことを考えていたことがあったので、自分の考えを少し書いてみようかと。
ファイルDL時に表示されるダイアログ内のデフォルトのファイル名を指定するには、HTTPのヘッダーに"Content-Disposition"を利用するのが定説とされている。
Content-Disposition: attachment; filename=sample.ext
だが、マルチバイト文字や半角スペースなどを含むfilenameをどう解釈するかはブラウザによってまちまちであり、どのように指定すればいいのかがはっきりとしない。
自分が主に使っているFirefox、IEに限定して話を進めていくとして、IEとFirefoxではURLのデフォルトのエンコードも異なっており、直接マルチバイト文字を含むURLを記述しては、HTTPサーバによってはエラーを返してくる。
ちなみに、
Content-Type: application/octet-stream; name=sample.txt
という記述もあるようだ。
どれにしてもいまいちちゃんと扱えないマルチバイト文字。
しかしFirefox、IEに限定した話であれば、URLの最後に無理やりファイル名を書くことでどうにかなりそうである。
一つ目に、PATH_INFOを使った方法。
ファイルダウンロード用のCGIを利用し、~/dl.cgi/sample.extというURLにすれば、ブラウザは標準でsample.extをファイル名にしてくれる。マルチバイト文字でも大抵のブラウザはOKのはず。
ただし、ファイルをブラウザに送るCGIを書かなくてはならない。
動的にファイルを生成するのであれば、よい方法だと思うが、既存の大きなファイルをそのまま出力するのであれば、あまり適さない。
二つ目に、mod_rewriteを使った方法。
mod_rewriteは利用できるサーバが限られてしまうが、サイズの大きなファイルにはよい方法。
RewriteEngine on
RewriteRule ^files/(.{1,})/.{1,} ./files/$1 [L]
mod_rewriteを使用し、最後のスラッシュ以降は無視する方法。
~/files/nihongo.extという実ファイルに対して、日本語.extというファイル名でDLさせたい場合、
~/files/nihongo.ext/日本語.extというURLにアクセスさせる。個人的にはここではURLエンコードをせず、マルチバイト文字のまま記述するのがいいかと思っている。
サーバに対するリクエストはURLエンコードされていたりするが、その部分は正規表現によって無視され、~/files/nihongo.extというリクエストとして処理される。
こうすることでマルチバイト文字でDLさせることができるけど、PSPでは無理だった。
PSPでマルチバイト文字のまま保存させたければ、xpdというファイルを使えばいいので、どうにかすることは可能である。