【问题标题】:Serving downloads with PHP and cURL使用 PHP 和 cURL 提供下载服务
【发布时间】:2011-05-23 22:31:45
【问题描述】:

我正在编写一个脚本,使用我的 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_close($ch); 永远不会被执行。 return 从函数返回。

标签: php curl download megaupload


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    是的,正如它所说的那样,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!");
    }
    

    【讨论】:

      【解决方案3】:

      算法

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多