2011-10-11 96 views
0

我查了一下,也搜索了一下,但没有找到任何方法来解决我的问题。php curl下载tbz文件?

我想下载与TBZ扩展名的文件,但它给我的错误作为

Warning: feof() expects parameter 1 to be resource, string given in D:\xampp\htdocs\test\testing.php on line ** 

我使用卷曲从服务器下载该文件。

 set_time_limit(0); 
     $ch = curl_init(); 
     $timeout = 0; 
     curl_setopt ($ch, CURLOPT_URL, $webpage_url); 
     curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 

     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 

     $handler = curl_exec($ch); 

     $fp = fopen("adminArea/test/$file", "w+"); 
     $contents = ''; 
     while (!feof($handler)) { 
      $contents .= fread($handler, 8192); 
      fwrite($fp, $handler); 
     } 
     fclose($fp); 

     curl_close($ch); 

我的文件是MB,当我执行这个我得到一个更大的文件。如果我运行代码时我的文件大小是16m,那么需要很多时间,当我手动停止它时,它的大小为146MB。我做错了什么?

回答

0

我不相信你试图访问的文件的类型对代码的工作方式有很大的影响。

首先,当CURLOPT_RETURNTRANSFER被设置时,curl_exec将返回数据。其次,feof,fread等需要文件句柄,而不是cURL句柄或返回的数据(这就是为什么你的错误信息显示你正在发送字符串)。

你的代码也许应该是这样的,而不是:

set_time_limit(0); 
    $ch = curl_init(); 
    $timeout = 0; 
    curl_setopt ($ch, CURLOPT_URL, $webpage_url); 
    curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 

    file_put_contents("adminArea/test/$file", curl_exec($ch)); 
    curl_close($ch); 

虽然我会亲自测试错误犯什么(除非这是,比方说,只为个人一次性的使用)前。

+0

感谢您的回复。我之前尝试了相同的代码,但是这只在我的目录中创建了1KB的文件。所以我想做文件处理的方式。这段代码只为我创建一个1KB的文件,而不是实际的大小。 – Astha

+0

我怀疑文件处理会弄乱你的文件 - 更可能的是,外部服务器发送1KB响应,而不是你所期望的。许多可能的原因,例如,这会将用户重定向到实际文件,或者该站点需要POST请求,或者该站点需要特定的User-Agent标头等。 检查此文件的内容以查看是否可以从中收集任何东西。 – zinga