使用PHP和cURL提供下载服务


Serving downloads with PHP and cURL

我正在编写一个脚本,为使用我的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)请求下载。

有人能想出一种可行的方法吗?干杯

使用您尝试使用的方法不会起作用(或者不会像您想象的那样起作用)。

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

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

这里有一个链接到之前的讨论,有人做了很好的解释。基本上,你需要以可管理的块处理文件,并将其交给客户端的浏览器:操作一个3000万个字符长的字符串

你也可以尝试使用套接字,但你必须处理你的cookie代码,因为curl在幕后为你处理了很多。

是的,正如它所说,readfile需要一个文件名,而您给它一个curl结果的字符串。只需在设置正确的标题后使用回声:

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!");
}

该的算法

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