2013-06-27 89 views
2

我花了幾天的時間尋找解決方案,使用php開始下載,當然,我確實找到了很多解決方案。不幸的是他們都沒有爲我工作。無論什麼原因,當我測試它並嘗試開始下載時,它確實顯示了我想要的文件,但是當我下載它時,無論它打算下載什麼樣的文件,它都會下載爲帶有我的網站HTML的文本文件。如何開始使用php下載

這裏是我試過的許多例子中的一個例子:

header("Content-Disposition: attachment; filename=\"" . basename($File) . "\""); 
header("Content-Type: application/force-download"); 
header("Content-Length: " . filesize($File)); 
header("Connection: close"); 
+0

標題發送後輸出的任何內容都將成爲下載文件的一部分。如果您的網站正在下載腳本中加載html,那麼是的,它將包含在下載中。 –

+5

'application/force-download'不強制下載。 「內容處置」應該照顧到這一點。你可能想要一個有效的內容類型,儘管像'application/octet-stream'。 –

回答

3

你可以試試這個嗎?你需要readfile()功能。

<?php 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename='.basename($file)); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 
    readfile($file); 
    exit; 
?> 
+0

請注意'ob_clean()'和'flush()'確保在開始下載之前緩衝區爲空,並確保在開始下載之前沒有其他內容被髮射。特別注意空行。 – 2013-06-27 23:12:36

+0

非常感謝Ozkan Ozlu,這很完美。 :d。你一直很有幫助,我非常感激。 – user2529964

+0

如果你沒有初始化緩衝區,'ob_flush()'可以輸出一個警告,'flush()'也是如此,除此之外它不能確保任何東西。我不認爲應該調用這些函數來發送文件,除非您確定它們在項目設計中的用途。 – Havenard

1

而不是試圖提供文件,使用PHP,與x-sendfile頭將它交給服務器。性能要好得多(特別是對於大文件),服務器將處理必要的響應頭。

有一個Apache mod它被內置到Lighttpd和Nginx(名稱略有不同)。