2012-02-11 86 views
3

是否可以強制下載PHP中的遠程文件而不將其讀入內存?我知道fpassthru(),readfile(),file_get_contents()都會在將文件輸出到瀏覽器之前將它們讀入內存。PHP強制下載遠程文件而不讀入內存

這裏是我的代碼:

if($url = getRemoteFileURL($file_id)) 
{ 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename="abc.zip"'); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Pragma: public'); 
    header('Pragma: no-cache'); 

    readfile($url); // is there a better function ? 
} 

我不想做標題(「位置:」),因爲如果你做一個header("Location: ...");到下載的文件,將顯示網址

+0

您可以使用分塊獲取遠程文件,並將其分開。但是這需要來自您的腳本的多個http請求,效率非常低。 – 2012-02-11 04:52:02

回答

2

中,如果有的話,URL實際上並沒有透露太多。

無論如何,readfile可能是您最好的選擇。假設它直接寫入輸出,PHP會繼續讀取文件的一部分,然後輸出它,然後讀取下一部分等,總體上使用很少的內存。

+0

該URL向任何有足夠洞察力的人都會公開,有時候這是不可接受的。另外,如果你這樣做,你不能控制文件名。 – 2012-02-11 04:48:37

+0

是的,亞歷克是對的。在Chrome中,您只需轉到當前的下載頁面即可看到該網址。此外,只要正在下載文件,readfile就會導致腳本運行。 IMO效率不高。例如,如果我正在下載一個1GB文件30分鐘,腳本將運行30分鐘(不知道某些服務器是否會因運行該腳本的腳本超時) – peter 2012-02-11 17:53:08

+0

默認最大PHP腳本執行時間爲30秒...所以是的,這將無法使用默認值。 – chris342423 2016-02-19 15:47:55