Peter
Peter

Reputation: 9113

Outputting and saving a csv in PHP

I am currently creating and outputting a CSV as follows:

header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=file.csv');
header("Cache-Control: no-store, no-cache");

$df = fopen('php://output', 'w');
fprintf($df, chr(0xEF).chr(0xBB).chr(0xBF));
foreach ($csvLines as $csvLine) {
    fputcsv($df, $csvLine);
}
exit;

However, I would like to not only output but also save this file to disk. How can I write $df to a file?

Note Suggestions on improving my generating the CSV are welcome :)

Upvotes: 0

Views: 1380

Answers (2)

Mark Baker
Mark Baker

Reputation: 212402

The simplest answer is to write to the file instead of php://output, and then send that file directly to the browser using readfile()

header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=file.csv');
header("Cache-Control: no-store, no-cache");

$df = fopen('/path/to/where/you/want/the/file/on/disk.csv', 'w');
fprintf($df, chr(0xEF).chr(0xBB).chr(0xBF));
foreach ($csvLines as $csvLine) {
    fputcsv($df, $csvLine);
}
readfile('/path/to/where/you/want/the/file/on/disk.csv');
exit;

Upvotes: 1

deceze
deceze

Reputation: 522005

Simply write to two file pointers:

$out = fopen('php://output', 'w');
$file = fopen('somefile.csv');

fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));
fprintf($file, chr(0xEF).chr(0xBB).chr(0xBF));

foreach ($csvLines as $csvLine) {
    fputcsv($out, $csvLine);
    fputcsv($file, $csvLine);
}

exit;

Upvotes: 1

Related Questions