end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

perl cgiでダウンロードさせるファイル名を指定

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

そういえば、jsonは「application/json」だったかな?