您好,登錄后才能下訂單哦!
小編給大家分享一下如何利用Curl下載文件實(shí)現(xiàn)實(shí)時(shí)進(jìn)度條顯示,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
效果圖:
還是挺好看的!
curl有什么用?
用php ,curl主要是抓取數(shù)據(jù),當(dāng)然我們可以用其他的方法來(lái)抓取,比如fsockopen,file_get_contents等。但是只能抓那些能直接訪問(wèn)的頁(yè)面,如果要抓取有頁(yè)面訪問(wèn)控制的頁(yè)面,或者是登錄以后的頁(yè)面就比較困難了。
curl使用
curl做為 PHP 一個(gè)很常用的下載方式,這里簡(jiǎn)單的使用方式;
// 初始化一個(gè) curl $ch = curl_init(); // 設(shè)置請(qǐng)求的 url curl_setopt($ch, CURLOPT_URL, $url); // curl_setopt($ch, CURLOPT_HEADER, 0); // 不直接輸出,而是通過(guò) curl_exec 返回 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); if (false === ($stream = curl_exec($ch))) { throw new \Exception(curl_errno($ch)); } curl_close($ch); return $stream;
上面是一個(gè)很簡(jiǎn)單的例子,如果一個(gè)文件很大,那么用戶(hù)就需要等待很長(zhǎng)的時(shí)間,這時(shí)候我們就應(yīng)該加上進(jìn)度條的效果:
class Request { protected $bar; // 是否下載完成 protected $downloaded = false; public function __construct() { // 初始化一個(gè)進(jìn)度條 $this->bar = new CliProgressBar(100); $this->bar->display(); $this->bar->setColorToRed(); } function download($url) { $ch = curl_init(); // 從配置文件中獲取根路徑 curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0); // 開(kāi)啟進(jìn)度條 curl_setopt($ch, CURLOPT_NOPROGRESS, 0); // 進(jìn)度條的觸發(fā)函數(shù) curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'progress'); // ps: 如果目標(biāo)網(wǎng)頁(yè)跳轉(zhuǎn),也跟著跳轉(zhuǎn) // curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); if (false === ($stream = curl_exec($ch))) { throw new \Exception(curl_errno($ch)); } curl_close($ch); return $stream; } /** * 進(jìn)度條下載. * * @param $ch * @param $countDownloadSize 總下載量 * @param $currentDownloadSize 當(dāng)前下載量 * @param $countUploadSize * @param $currentUploadSize */ public function progress($ch, $countDownloadSize, $currentDownloadSize, $countUploadSize, $currentUploadSize) { // 等于 0 的時(shí)候,應(yīng)該是預(yù)讀資源不等于0的時(shí)候即開(kāi)始下載 // 這里的每一個(gè)判斷都是坑,多試試就知道了 if (0 === $countDownloadSize) { return false; } // 有時(shí)候會(huì)下載兩次,第一次很小,應(yīng)該是重定向下載 if ($countDownloadSize > $currentDownloadSize) { $this->downloaded = false; // 繼續(xù)顯示進(jìn)度條 } // 已經(jīng)下載完成還會(huì)再發(fā)三次請(qǐng)求 elseif ($this->downloaded) { return false; } // 兩邊相等下載完成并不一定結(jié)束, elseif ($currentDownloadSize === $countDownloadSize) { return false; } // 開(kāi)始計(jì)算 $bar = $currentDownloadSize / $countDownloadSize * 100; $this->bar->progress($bar); } } (new Request)->download('http://www.shiguopeng.cn/database.sql');
千萬(wàn)千萬(wàn)注意下載回調(diào)的判斷那里的坑?。。?/p>
還有一個(gè)問(wèn)題:如果跳轉(zhuǎn)下載的,設(shè)置了curl也跟著跳轉(zhuǎn),返回的文件將會(huì)出問(wèn)題,
我下載的是zip文件,會(huì)導(dǎo)致文件頭有第一此請(qǐng)求的HTTP響應(yīng)頭的內(nèi)容,
所以看自己需要curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
以上是“如何利用Curl下載文件實(shí)現(xiàn)實(shí)時(shí)進(jìn)度條顯示”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。