2011-02-10 44 views
4

我想用curl下載遠程文件並將其立即輸出給用戶。 用戶應該認爲他從我的服務器而不是遠程服務器下載文件。我無法緩衝整個文件,因爲有些文件大於200 MB。此外,用戶將不得不等待完成緩衝,直到他可以開始下載文件。直接下載捲曲的遠程文件

我發現一個腳本下載直接從遠程服務器上的文件:

<?php 
$file_name = $_GET['file']; 
$file_url = 'http://www.remote.tld/' . $file_name; 
header('Content-Type: application/octet-stream'); 
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename=\"".$file_name."\""); 
readfile($file_url); 
exit; 
?> 

就是這種直接的遠程下載也可能有捲曲?

+0

這是可能的,但我不明白你爲什麼想。當然,最好使用更可靠的本地PHP功能? (除非你有`allow_fopen_url`禁用...) – lonesomeday 2011-02-10 12:55:18

回答

5

您需要閱讀並輸出文件,因爲整個200MB文件可能不適合您的PHP腳本的內存。

請參閱this question關於如何在curl中執行此操作。 the manual有一個實例。從被盜和修改,這樣的事情應該工作(未經測試):

<?php 
curl_setopt($this->curl_handle, CURLOPT_WRITEFUNCTION, "receiveResponse"); 

function receiveResponse($curlHandle,$data) 
    { 
         echo $data; // Ouput to the user 
         $length = strlen($data); 
         return $length; 

       } 
?> 

請注意,這很少是一個好主意。它會給服務器帶來相對較大的負載 - 如果您的流量數量合理高,爲成爲下載服務提供商的虛榮心付出高昂的代價。另外,當然,200MB的下載量將爲您的流量賬單創建400MB!

+0

嗨,謝謝你的回答和你的提示。我想我會盡量不捲曲地處理它。無論如何,這是非常有趣的。我不知道我可以使用寫入功能... – 2011-02-10 14:09:05

0

如果不在服務器上緩衝文件,則無法從服務器提供文件。

沒有技術解決方案,也沒有CURL,因爲您無法訪問對端服務器的DNS服務器,以隱藏相反的URL。