2012-06-06 32 views
7

我想通過查詢數據庫來生成帶有數據的csv文件。然後瀏覽器應該提示用戶下載文件。問題是,readfile函數需要一個文件名而不是句柄,但我找不到一個函數來獲取這個臨時文件的文件名。 我想有更好的方法來做到這一點,但我找不到它們。如何導出動態生成的臨時csv文件?

$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(); 
+0

? –

+0

是@khaled_webdev – Riesling

+0

你可以直接從一個mysql查詢生成文件 –

回答

13

您正在尋找rewind到文件指針到文件的開頭,後跟fpassthru復位輸出文件的所有內容。

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

另一種解決方案是使用tempnam生成關閉時不被除去的唯一文件。當你完成它時,不要忘記手動刪除它。

$name = tempnam('/tmp', 'csv'); 
$handle = fopen($name, 'w'); 
... 
fclose($handle); 
readfile($name); 
unlink($name); 
+0

這就是我正在尋找的東西,像一個魅力,謝謝 – Riesling

2

使用

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

而且你的文件名了。

+0

不要忘了刪除後的文件。但埃米爾的解決方案似乎更好。 – Zoka

0

從MySQL

SELECT id, name, email INTO OUTFILE '/tmp/result.csv' 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
ESCAPED BY ‘\\’ 
LINES TERMINATED BY '\n' 
FROM users WHERE 1 

,並刪除它按需

重新定義分離器等PARAM因爲你是你用mysql需要