2011-05-23 71 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. 下载文件