我正在编写一个脚本,使用我的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)请求下载。
有人能想到一种有效的方法吗?欢呼声。
答案 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)
该算法