2012-10-31 85 views
0

我可以做這樣的事情嗎?輸出緩衝php文件下載

ob_start(); 
header("Content-Type: application/msword"); 
header("Content-Disposition: attachment; filename=".$title); 
header("Content-Length: ".$size); 
header("Content-Transfer-Encoding: binary"); 
readfile($path); 
ob_end_flush(); 

目前我正在下載正確命名的文件,但該文件的內容是從包含上述代碼的PHP的HTML輸出。

我已驗證$路徑是否正確。 $大小會導致這種情況發生嗎? 我也試過在ob_start()之後直接ob_flush()。

編輯:現在下面的代碼:

if (file_exists($path)){ 
    ob_start(); 
    header("Content-Type: application/msword"); 
    header("Content-Disposition: attachment; filename=".$title); 
    header("Content-Length: ".filesize($path)); 
    header("Content-Transfer-Encoding: binary"); 
    readfile($path); 
    ob_end_flush(); 
    die(); 
    } else die ("Not Found"); 

與上述相同的問題代碼的結果。文件被下載,命名正確,顯然存在並且大小正確,但文件的內容是頁面的html輸出。

在此先感謝

我只注意到這是在文件的最後是下載(錯誤地): 「INT(14)內容」

,但我不是故意的任何地方輸出這在我的代碼中。

+2

記住ob_start導致ReadFile的讀取內存中的整個文件,有什麼可以引起大的文件存儲的問題。還要確保$ size是正確的,'filesize($ path);'是完美的,但我不能在你的代碼中看到它。 –

回答

1

也許一些調試,可能會有幫助:

if (file_exists($path)) { 
    ob_start(); 
    header("Content-Type: application/msword"); 
    header("Content-Disposition: attachment; filename=".$title); 
    header("Content-Length: ".filesize($path)); 
    header("Content-Transfer-Encoding: binary"); 
    readfile($path); 
    ob_end_flush(); 
    die(); // To not send the HTML afterwards 
} else die("Not found"); 
+0

我試過了,問題依然存在。上面更新的代碼。 – V1GG3N