2013-07-26 63 views
0

我在php.net中發現了這個腳本,它允許用戶下載本地文件。每當我嘗試在文件名的前面使用協議時,PHP都找不到該文件。我在php.net中啓用了allow_url_fopen。我應該怎麼做才能允許遠程文件被下載?如何快速下載PHP中的遠程文件?

此外,即使在下載管理器的幫助下,下載速度也非常慢。我能做些什麼來提高下載速度嗎?有沒有辦法允許下載管理器中的「恢復下載」選項?

<?php 
$file = 'https://www.example.com/test.exe'; 
if (file_exists($file)) { 
    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; 
} else echo "file not found." 
?> 
+1

如果文件緩慢下載,請嘗試增加可用於服務器或下載用戶的帶寬。運行這個腳本總是會讓它比用戶直接下載文件要慢 – Anigel

+0

你不添加協議到附件頭沒有必要 –

+0

@Anigel:抱歉,我必須不同意。中間人下載可以更快。 –

回答

1

「恢復下載」需要執行Range標頭。您必須從請求標頭中取出此標頭,並在發送請求時將其傳遞到後端。顯然,可以設置使用HTTP協議包裝器fopen時發送的頭文件(讓我們看看是否找到這樣的例子...)

如果要下載的文件可以通過互聯網公開訪問,爲什麼不要將用戶重定向到Location標題?這將從數據路徑中刪除您的服務器,可能會提供最快的選項。

您的第二好選擇是在Web服務器上配置反向代理for example with mod_rewrite。這至少將PHP解釋器帶出了等式。

+0

我需要隱藏用戶的真實下載網址。 「位置」標題的問題在於它顯示了下載管理器中的下載網址。 –

+2

然後,我會建議使用專用的反向代理或將Web服務器配置爲一個 – Joni