めちゃくちゃ苦戦しました。IE滅ぶべし†
調べてもPHPの記事しかでてこないんですよね。ということで、自分と同じ状況になっているパーラーを助けるべく記事として残します。
解決策
いってしまうとこれでOKです。レスポンスヘッダにファイル名を明記します。
# 日本語ファイル名である、$file_nameを引数として受け取る
$c->res->header(
'content_disposition' => "attachment;
filename=$file_name.csv;
filename*=UTF-8''$file_name.csv",
);
filenameが2行あるのがミソで、filename*が有効なブラウザではfilename側は無視されるという特徴を突いた記述になります。
参考)https://tools.ietf.org/html/rfc6266#section-4.3
もちろん、日本語のファイル名を渡す際にURIエンコードしてくださいね!
use URI::Escape;
$file_name = URI::Escape::uri_escape($file_name);
- 日本語ファイル名はURIエンコードして渡す
- 日本語でないファイル名は通常通り渡す
- 別にURIエンコードしてもOK!
このルールさえ徹底すれば、日本語ファイルでも問題なく全ブラウザでエンコードする事ができます。
全ブラウザとか言ってますが、以下でしか動作確認してないので注意。スマホとかOperaは知りません。
- IE11
- Edge
- GoogleChrome
- FireFox
- Safali