2012年3月1日木曜日

ファイルダウンロード

PHPでcsvファイルをダウンロードするサンプルプログラムを作成してみました。

最初のソースはファイルを作成して、ダウンロードさせるパターンです。
ファイル内容が、膨大な量になる時はこちらの方法がいいのかと思います。
<?php
$file = '/tmp/file.csv.' .getmypid();
$fp = fopen($file, 'w');
if ($fp === false) {
error_log('file open error');
exit(1);
}

$header = array('num',
'line',
'data',
);
fputcsv($fp, $header);

for($i=1;$i<=100;$i++) {
$line = array($i,
'line' . $i,
'data' . $i,
);
fputcsv($fp, $line);
}

fclose($fp);

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="download.csv"');
header('Content-Length: '.filesize($file));
readfile($file);

@unlink($file);
exit(0);



二つ目のソースは出力バッファを利用したものになります。
自分はファイルの内容問わず、ファイルを作成する方法でやっていたのですが、内容が大した量ではないときはこちらの方法の方が効率良いかと思います。
<?php
$fp = fopen('php://output', 'w');
if ($fp === false) {
error_log('file open error');
exit(1);
}

ob_start();
$header = array('num',
'line',
'data',
);
fputcsv($fp, $header);

for($i=1;$i<=100;$i++) {
$line = array($i,
'line' . $i,
'data' . $i,
);
fputcsv($fp, $line);
}

$str = ob_get_contents();
fclose($fp);
ob_end_clean();

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="download.csv"');
header('Content-Length: '.strlen($str));
echo $str;

exit(0);



入出力ストリームへのアクセスとか全然知らなかったので、非常に勉強になりました。
PHPマニュアル

0 件のコメント:

コメントを投稿