Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to export a dynamically generated temporary csv file?

I would like to generate a csv file with data, that I get by querying a database. The browser then should prompt the user to download the file. By problem is, that the readfile function needs a filename and not a handle, but I can't find a function to get the filename of this temporary file. I guess there are better ways to do this, but I can't find them.

$handle = tmpfile();
fputcsv($handle, array('year', 'month', 'product', 'count'));
header('Content-Type: application/csv');
header('Content-Disposition:attachment;filename=LS_export');
echo readfile($handle);
fclose($handle);
exit();
like image 560
Riesling Avatar asked Jun 06 '12 10:06

Riesling


2 Answers

You are looking for rewind to reset the file pointer to the start of the file, followed by fpassthru to output all the contents of the file.

rewind($handle);
fpassthru($handle);

Another solution is to use tempnam to generate a unique file which is not removed when closed. Do not forget to remove it manually when you are done with it.

$name = tempnam('/tmp', 'csv');
$handle = fopen($name, 'w');
...
fclose($handle);
readfile($name);
unlink($name);
like image 107
Emil Vikström Avatar answered Nov 15 '22 01:11

Emil Vikström


Use

$tmpfname = tempnam("/", "");
$handle = fopen($tmpfname, "w");
...
fclose($handle);

And you have the filename too.

like image 42
Zoka Avatar answered Nov 15 '22 01:11

Zoka