2013-06-20 50 views
-1

我知道這個類似的問題是之前問過的,但我找不到解決我的特定問題的方法。 我有這個代碼,它保存到一個文件並從瀏覽器運行時立即下載到桌面。但我需要它將它保存在服務器上。我如何用這個特定的代碼來做到這一點?如何使用PHP收集文件並保存在服務器上

我是否需要將文件保存到變量中,例如$files第一?

<?php 


header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Content-Type: application/force-download"); 
header("Content-Type: application/octet-stream"); 
header("Content-Type: application/download"); 
header("Content-Disposition: attachment;filename=export_".date('n-j-Y').".xls "); 
header("Content-Transfer-Encoding: binary "); 

exit(); 

?> 
+0

退房['file_put_contents'(http://php.net/file_put_contents) – Dale

+0

@Dale我讀了它,但無法弄清楚..你能幫助我嗎? – MOTIVECODEX

回答

2

下面是一些正常的代碼:

<?php 
echo "hey F4LLCON!"; 
?> 

執行時,它的行爲就像我們期望:

% php output.php 
hey F4LLCON! 

現在,我將修改它以添加輸出緩衝,並保存到文件寫入stdout(使用常規的echo調用!):

<?php 
ob_start(); 
echo "hey F4LLCON!"; 
$output_so_far = ob_get_contents(); 
ob_clean(); 
file_put_contents("/tmp/catched.txt", $output_so_far); 
echo $output_so_far; 
?> 

執行後,文件catched.txt輸出等於我們得到早期(現在仍然得到)在stdout:

hey F4LLCON! 

現在我要再次進行修改,以顯示如何從PHP 5.5發電機將爲您提供一個優雅的解決方案,無需犧牲性能(以前的解決方案需要您保存在一個巨大的輸出緩衝區所有中間內容):

<?php 
$main = function() { 
    yield "hey F4LLCON!"; 
}; 
$f = fopen("/tmp/catched2.txt", "wb"); 
foreach ($main() as $chunk) { fwrite($f, $chunk); echo $chunk; } 
fclose($f); 
?> 

我們不是存儲一個巨大的緩衝一切,我們仍然可以輸出到文件 stdout同時。

如果您不瞭解生成器,下面是我們將回調「print」函數傳遞給main()的解決方案,並且每次我們要輸出時都會使用該函數(此處只有一次)。

<?php 
$main = function($print_func) { 
    $print_func("hey F4LLCON!"); 
}; 
$f = fopen("/tmp/catched3.txt", "wb"); 
$main(function($output) use ($f) { 
    fwrite($f, $output); 
    echo $output; 
}); 
fclose($f); 
?> 
+0

所以我可以放置'$ main = function(){'之前和'}; $ f = fopen(「/ tmp/catched2.txt」,「wb」); foreach($ main()as $ chunk)fwrite($ f,$ chunk); fclose($ f); echo $ output;'在我的代碼之後?它給我一個語法錯誤。 我可以在我現有的代碼中使用你的方法嗎? – MOTIVECODEX

+1

如果你使用PHP 5.5並且在全局範圍內沒有'return'(希望你沒有),那麼你只能這樣做。如果你想要一個幾乎可以肯定適用於你的解決方案,可以使用第一個(帶有'ob_start')。閱讀關於輸出緩衝的PHP文檔:http://php.net/ob_start –

+0

真棒!它將文件保存到我的服務器,但最後一件事,我怎樣才能指定它保存文件的目錄? (使用ob_start();) – MOTIVECODEX

相關問題