2012-08-17 18 views
4

我使用PHP的fputcsv()通過創建服務器上的文件,加油吧,然後鏈接到它的下一個網頁上刊登從MySQL數據庫中的一些記錄。如何作爲文件輸出,但不保存在服務器上

這工作是偉大的,但因爲這可能是敏感數據,我不希望文件閒逛時,他們的(可能)一次性下載在服務器上創建的布赫。

所以我想知道的是:有沒有一種方法可以創建這個文件&服務下載沒有實際上寫在服務器上的永久文件?

比如我可以創建一個逗號分隔的字符串,而不是使用fputcsv(),服務與輸出緩衝器正確的頭?

最明顯的舉動是要刪除的文件,但我需要等待,直到客戶端下載第一它,這樣使得它有點難以決定何時做。

任何建議,歡迎

代碼:

$fp = fopen($filename, 'w'); 
fputcsv($fp, array("Last Name", "First Name")); 
foreach ($result as $fields) 
{ 
    fputcsv($fp, $fields); 
} 
fclose($fp); 

http://php.net/manual/en/function.fputcsv.php

回答

3

而不是,爲什麼不只是有你的頁面呼應了csv mime type,然後將該文件回聲出給用戶?

它的工作方式的魅力,是永遠不會創建的文件,作爲一次性傳遞到客戶端。

事情是這樣的:

header("Content-type: application/csv"); 
header("Content-Disposition: attachment; filename=file.csv"); 
header("Pragma: no-cache"); 
header("Expires: 0"); 

echo "col1,col2"; 
for($i=0; $i<25;$i++) 
{ 
    echo "key :".$i.", ".($i*$i)."\r\n"; 
} 

你應該能夠測試出的是,看看它是如何工作的。

增加的美妙之處在於大多數用戶將被引導到下載的文件,而不是打開它,這樣用戶甚至不離開頁面(大部分時間)。

+0

我知道* *我是過分複雜。謝謝!順便說一句,你有第二個開放式支架:) – jammypeach 2012-08-17 09:58:22

+0

不用擔心。修正了支架(和原來的其他拼寫錯誤:) :) – Fluffeh 2012-08-17 09:59:13

+0

現在剛剛測試過,這樣做的工作。再次感謝,也鏈接到MIME類型的列表是非常方便的:) – jammypeach 2012-08-17 10:05:53

4

fputcsv()是一個神話般的小函數,所以我不會放棄它。

相反,我建議你在內置I/O Wrappers

玩弄PHP的你,可以,例如,這樣做是爲了「流」您的CSV數據線,由線(受各種輸出緩衝器,但那是另一回事):

<?php 
header('Content-type: text/csv; charset=UTF-8'); 
header('Content-disposition: attachment; filename=report.csv'); 
$fp = fopen('php://output','w'); 
foreach($arrays as $array) fputcsv($fp, $array); 

這工作不錯,但如果出現問題,用戶將有一個破碎的下載。

所以,如果你沒有太多的數據,你可以只寫一個內存流,只是換出php://outputphp://memory和移動的東西:

<?php 
$fp = fopen('php://memory','rw'); 

// our generateData() function might throw an exception, in which case 
// we want to fail gracefully, not send the user a broken/incomplete csv. 
try { 
    while($row = generateData()) fputcsv($fp, $row); 
}catch(\Exception $e){ 
    // display a nice page to your user and exit/return 
} 

// SUCCESS! - so now we have CSV data in memory. Almost like we'd spooled it to a file 
//   on disk, but we didn't touch the disk. 

//rewind our file handle 
rewind($fp); 

//send output 
header('Content-type: text/csv; charset=UTF-8'); 
header('Content-disposition: attachment; filename=report.csv'); 
stream_get_contents($fp); 
相關問題