2011-05-23 70 views
1

我正在編寫一個腳本,使用我的Megaupload高級帳戶爲用戶下載服務。這是我使用的下載互聯星空文件的方法:用PHP和cURL提供服務下載

public function download_file($link) 
{ 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $link); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . "/cookies/megaupload.txt"); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    return curl_exec($ch); 
    curl_close($ch); 
} 

這是它如何被稱爲index.php文件:

readfile($megaupload->download_file("http://www.megaupload.com/?d=PXNDZQHM")); 

我基本上希望這做的是服務下載到用戶並通過我的服務器進行下載。我不想將文件保存到我的服務器,然後提供給用戶。

但顯然,上述解決方案將無法正常工作。我得到這個錯誤:

Warning: readfile() [function.readfile]: Filename cannot be empty in C:\xampp\htdocs\index.php on line 8 

我需要使用捲曲的,因爲我需要使用Cookie文件(/cookies/megaupload.txt)來請求下載。

任何人都可以想到一個工作方式來做到這一點?乾杯。

+1

'curl_close($ ch);'永遠不會執行。 'return'從函數返回。 – ThiefMaster 2011-05-23 22:35:03

回答

1

是的,就像它說的那樣,readfile需要一個文件名,並且你給它一個curl結果字符串。只需使用回聲setting the proper headers後:

echo $megaupload->download_file("http://www.megaupload.com/?d=PXNDZQHM"); 

編輯:另外你需要做的,你得到的東西回來一些基本檢查:

public function download_file($link) 
{ 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $link); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . "/cookies/megaupload.txt"); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    $result = curl_exec($ch); 
    // close before you return 
    curl_close($ch); 
    return $result; 
} 

然後:

$filecontents = $megaupload->download_file("http://www.megaupload.com/?d=PXNDZQHM"); 
if($filecontents) { 
    echo $filecontents; 
} 
else { 
    die("Yikes, nothing here!"); 
} 
2

使用您嘗試使用的方法將不起作用(或不會像您想象的那樣工作)。

Curl會阻塞,直到文件完全下載。

您必須創建您自己的協議,並處理類中的寫入事件。

下面是以前討論的鏈接,其中有人對此做了很好的解釋。基本上你需要以可管理的塊處理文件,並將它們交給客戶端的瀏覽器:Manipulate a string that is 30 million characters long

你也可以嘗試使用套接字,但是你將不得不使用你的cookie代碼,因爲curl處理很多在幕後爲你。

-1

算法爲

  1. 檢索所需的文件(成員)
    • 如果萬一直接URL路徑
    • 告訴你的腳本等待45秒(非會員)或25秒用戶是一個成員,用戶必須先登錄
  2. 下載文件