2011-10-11 105 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