CSVをブラウザに出力し、DLさせる

| | トラックバック(0)

カテゴリ:

データベースに格納したデータを取得して、それをブラウザで表示する、というのを書いていて、同時に、CSV形式にして、ボタンをクリックするとそのCSVをダウンロードさせる的な挙動をさせたい時に書いたコード。

データベースから取得したデータは、例えば下記のような構造になっているとする。

$out = {
    filename => '12345.csv',
    csv =>     [  [ a, b, c, d, e], [ 1, 2, 3, 4, 5] ...  ]
}

CGI.pmを使ってこれを出力する場合。(Text::CSVを使っています)

print qq/Content-Disposition: attachment; filename="$out->{filename}"\n/;
print header( -type => 'application/octet-stream');
my $csv = Text::CSV->new();

for my $row ( @{ $out->{csv} } ){
    $csv->print(*STDOUT, $row);
    print "\n";
}

Text::CSVの print は下記のようなことをしています。
combine + string + print

$csv->combine( @array );
print $csv->string();

これだと、CSVの改行がないので、改行も追加しています。

ただ、これだと、日本語は文字化けすると思うので、Encodeは必要かと。

use Encode 'encode_utf8';
$csv->combine( @array );
print encode_utf8( $csv->string() );

など。binmodeを使って、出力の文字コードを一括で制御するということでもOK。

参考:

トラックバック(0)

このブログ記事を参照しているブログ一覧: CSVをブラウザに出力し、DLさせる

このブログ記事に対するトラックバックURL: https://nozawashinichi.sakura.ne.jp/MT-4.25/mt-tb.cgi/1174

comments powered by Disqus

このブログ記事について

このページは、Shinichi Nozawaが2014年1月27日 23:29に書いたブログ記事です。

ひとつ前のブログ記事は「Perlでモジュールがコアに入っているかどうか」です。

次のブログ記事は「github で README.md を置くと」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。