ieの場合、拡張子以外をurlエンコードした上で、http responseヘッダを返せば、ダウンロードファイルの文字化けを防ぐことができそうです。
問題なく動作しているようですが、ブラウザを限定しないwebアプリなら、ダウンロードで返すファイル名はasciiにした方がよさそう。
sub get_http_download_header { my ($self,$filename) = @_; my $content_disposition; if ($ENV{HTTP_USER_AGENT} =~ /MSIE (.+?);/o){ my $basename = ''; my $extension = ''; if( $filename =~ /(.*?)(\.\p{InBasicLatin}+)/o){ $basename = $1; $extension = $2; } else { $basename = $filename; } #IEでは、拡張子以外をurl encodeみたい $filename = $self->url_encode( encode($ENC, $basename)) . $extension; my $ie_ver = $1; if ( $ie_ver eq '5.5'){ $content_disposition = "filename=$filename"; } else { $content_disposition = "attachment; filename=$filename"; } return header(-type=>"application/octet-stream", -Content_Disposition=>$content_disposition); } #firefox3.5でダウンロードファイル名が文字化しなかったのでOKとします #operaやchromeは未確認ですが、文字化したとしてもサポート外ということで. $content_disposition = "attachment; filename=$filename"; return header(-type=>"application/octet-stream", -Content_Disposition=>$content_disposition); }
参考) コンテンツタイプ一覧
先程のscriptでは「-type=>"application/octet-stream"」のように単なるバイナリデータとして返していますが、ダウンロード完了時に関連アプリを起動する為、 Content-type (MIME-type)を指定する場合、次のurlが参考になります。
http://www.abe-tatsuya.com/web_prog/perl_cgi/mime_type.php
http://www.atmarkit.co.jp/fnetwork/rensai/netpro03/content-type.html