ファイルをダウンロードさせる - Perl,CGI

この記事は2006年10月21日に書かれたものです。

テキストファイルや画像などを表示させるのではなく、ダウンロードをさせたい。

IEやFireFoxなどのブラウザでは、圧縮ファイル(zip, lha)などはファイルを保存するダイアログを自動的に出してくれるが、CSVなどのテキストファイルの場合、ただ表示されるだけである。

下記のようなヘッダを出力する部分を置き換えればOK。 print "Content-type: text/html\n\n";

サンプル

#!/usr/bin/perl
;#
;#ダウンロード
;#
 
#-- ダウンロード後のファイル名 --#
$file = 'stock_yahoo.csv';
 
#-- ダウンロード --#
print "Content-Type: application/octet-stream\n";
print "Content-Disposition: attachment; filename=$file\n";
print "\n";
 
#-- 内容を出力 --#
while(<DATA>){
  print ;
}
 
__END__
日付,始値,高値,安値,終値,出来高()
1020,"46,700","47,150","45,150","45,500","261,883"
1019,"48,600","49,100","46,900","47,450","323,015"
1018,"46,850","49,100","45,650","48,650","379,219"
1017,"46,550","47,650","45,500","46,900","335,802"
1016,"43,750","47,050","43,700","46,950","455,565"
1013,"41,450","43,600","41,450","43,350","369,306"
1012,"39,700","41,700","39,500","41,200","317,911"
1011,"40,650","40,650","39,150","39,300","296,626"
1010,"40,950","41,400","40,450","40,600","128,643"

実行例

FireFoxの場合

Excelで開いてみた

大抵のブラウザでは正常に動作するが、一部ファイル名の指定が出来ない(CGIのファイル名になる)などの現象が起こる場合がある。この場合はクエリー文字列を工夫することで解決することもある(「dl.cgi?file=xxx.csv」など)

余談だが、ファイルハンドル「DATA」は特殊な意味を持つ。これは通常のファイルではなく「 END 」以下にある内容を操作する際に用いる。ここではDATAを用いているが、普通のファイルを読み込み、その結果を返却しても良いし、データを動的に生成して返しても良い。内容はあなた次第。

※さらに余談だが、mod_perl環境下では「 END 」を書いてはならないという制約があるので注意。

関連書籍

failed to fetch data: unkown error

竹下 隆史, 村山 公保, 荒井 透, 苅田 幸雄
ISBN 4274068765
¥ 2,376

failed to fetch data: unkown error

コメント

コメントを入力. Wiki文法が有効です:
F N B Z Q