我正在编写一个脚本,为使用我的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!");
}
该的算法
- 检索所需文件的直接URL路径
- 告诉脚本等待45秒(非成员)或25秒(成员)
- 如果用户是成员,则用户必须首先登录
- 下载文件