end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

ダウンロードファイルの文字化け対策は、ブラウザ毎に必要

webアプリでcsv等のダウンロード用ファイルを返す場合、ieで日本語ファイル名が文字化けするので、その対処法を調べてみました。

次のスクリプトは、httpヘッダを返す部分のみを記述していますが、ieでのポイントは、拡張子以外をurlエンコードすることにあるようです。

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);
}

今回は ie ver.8とfirefox3.5でのみ、動作確認しましたが、operaの場合も異なる対処法が必要らしいので、日本語ファイル名は使わないのが楽かも?