使用PHP和cURL提供下载

时间:2011-05-23 22:31:46

标签: php curl download megaupload

我正在编写一个脚本,使用我的Megaupload高级帐户为用户下载提供服务。这是我用来下载Megaupload文件的方法:

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

我需要使用cURL,因为我需要使用cookie文件(/cookies/megaupload.txt)请求下载。

有人能想到一种有效的方法吗?欢呼声。

3 个答案:

答案 0 :(得分:2)

使用您尝试使用的方法将无效(或无法像您想象的那样工作)。

卷曲将阻止,直到文件完全下载。

您必须创建自己的协议,并在类中处理写事件。

这是前面讨论的链接,其中有人做了很好的解释。基本上,您需要以可管理的块处理文件,并将其移交给客户端的浏览器:Manipulate a string that is 30 million characters long

您也可以尝试使用套接字,但是您将不得不处理您的cookie代码,因为curl会为您处理很多幕后代码。

答案 1 :(得分:1)

是的,正如它所说的那样,readfile需要一个文件名,并且你给它一个curl结果的字符串。只需在setting the proper headers之后使用echo:

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 :(得分:-1)

该算法

  1. 检索所需文件的直接网址路径
  2. 告诉你的脚本等待45秒(非会员)或25秒(会员)
    • 如果用户是会员,则用户必须先登录
  3. 下载文件