国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【CLI】使用Curl下載文件實時進度條顯示

sydMobile / 1458人閱讀

摘要:最近在搗鼓命令行下的編程,下載文件總是一個難熬的過程,如果有進度條就好很多了先上一個進度條的擴展包,還是不錯的還是挺好看的做為一個很常用的下載方式,這里簡單的使用方式初始化一個設置請求的不直接輸出,而是通過返回上面是一個很簡單的例子,如

最近在搗鼓命令行下的編程,下載文件總是一個難熬的過程,如果有進度條就好很多了!!!


先上一個進度條的擴展包,還是不錯的https://github.com/dariuszp/cli-progress-bar

還是挺好看的!


curl做為 PHP 一個很常用的下載方式,這里簡單的使用方式;

// 初始化一個 curl
$ch = curl_init();
// 設置請求的 url
curl_setopt($ch, CURLOPT_URL, $url);
// 
curl_setopt($ch, CURLOPT_HEADER, 0);
// 不直接輸出,而是通過 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;

上面是一個很簡單的例子,如果一個文件很大,那么用戶就需要等待很長的時間,這時候我們就應該加上進度條的效果:

class Request
{
    protected $bar;
    // 是否下載完成
    protected $downloaded = false;

    public function __construct()
    {
        // 初始化一個進度條
        $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);
        // 開啟進度條
        curl_setopt($ch, CURLOPT_NOPROGRESS, 0);
        // 進度條的觸發函數
        curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, "progress");
        // ps: 如果目標網頁跳轉,也跟著跳轉
        // curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    
        if (false === ($stream = curl_exec($ch))) {
            throw new Exception(curl_errno($ch));
        }
    
        curl_close($ch);
    
        return $stream;
    }
    
    /**
     * 進度條下載.
     *
     * @param $ch
     * @param $countDownloadSize    總下載量
     * @param $currentDownloadSize  當前下載量
     * @param $countUploadSize      
     * @param $currentUploadSize
     */
    public function progress($ch, $countDownloadSize, $currentDownloadSize, $countUploadSize, $currentUploadSize)
    {
        
         // 等于 0 的時候,應該是預讀資源不等于0的時候即開始下載
         // 這里的每一個判斷都是坑,多試試就知道了
        if (0 === $countDownloadSize) {
            return false;
        }
        // 有時候會下載兩次,第一次很小,應該是重定向下載
        if ($countDownloadSize > $currentDownloadSize) {
            $this->downloaded = false;
            // 繼續顯示進度條
        }
        // 已經下載完成還會再發三次請求
        elseif ($this->downloaded) {
            return false;
        }
        // 兩邊相等下載完成并不一定結束,
        elseif ($currentDownloadSize === $countDownloadSize) {
            return false;
        }
        
        // 開始計算
        $bar = $currentDownloadSize / $countDownloadSize * 100;
        $this->bar->progress($bar);
    }
}
(new Request)->download("http://www.shiguopeng.cn/database.sql");

千萬千萬注意下載回調的判斷那里的坑!!!

還有一個問題:如果跳轉下載的,設置了curl也跟著跳轉,返回的文件將會出問題,

我下載的是zip文件,會導致文件頭有第一此請求的HTTP響應頭的內容,

所以看自己需要curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/28472.html

相關文章

  • PHP 遠程文件下載進度實現

    摘要:原文地址實現遠程下載文件到服務端并不是什么新鮮玩意,用等都能夠輕易實現。原理也許你在搜索下載進度條的時候會看到有些文章使用的輸出控制函數之類的控制緩沖區來實現進度條。 原文地址:https://prinzeugen.net/implem... PHP 實現遠程下載文件到服務端并不是什么新鮮玩意,用 cURL、file_get_contents、fopen 等都能夠輕易實現。 但是這幾種...

    YJNldm 評論0 收藏0
  • Vue+ElementUI: 手把手教你做一個audio組件

    摘要:不顯示下載不顯示靜音不顯示音量條不顯示進度條只能播放一個不要快進按鈕例如父組件這樣回雪月花青春一點點語法大多數時候,我們希望頁面上播放一個音頻時,其他音頻可以暫停。可以把一個類數組轉化成數組,這個是我常用的。 showImg(https://segmentfault.com/img/remote/1460000016177005?w=619&h=343); 目的 本項目的目的是教你如...

    U2FsdGVkX1x 評論0 收藏0
  • element-ui+vue-cli3.0:el-upload

    摘要:最近項目中涉及很多文件上傳的地方,然后文件上傳又有很多限制。比如文件大小限制,文件個數限制,文件類型限制,文件上傳后的列表樣式自定義,包括上傳進度條等問題。下面是我對的上傳組件的一些改造,點擊查看源碼。 最近項目中涉及很多文件上傳的地方,然后文件上傳又有很多限制。比如文件大小限制,文件個數限制,文件類型限制,文件上傳后的列表樣式自定義,包括上傳進度條等問題。下面是我對element-u...

    yy13818512006 評論0 收藏0
  • 在Vue項目中使用WebUploader實現文件上傳

    摘要:簡介是由團隊開發的一個簡單的以為主,為輔的現代文件上傳組件。采用大文件分片并發上傳,極大的提高了文件上傳效率。另外分片傳輸能夠更加實時的跟蹤上傳進度。選擇文件的按鈕。 簡介:WebUploader是由Baidu WebFE(FEX)團隊開發的一個簡單的以HTML5為主,FLASH為輔的現代文件上傳組件。在現代的瀏覽器里面能充分發揮HTML5的優勢,同時又不摒棄主流IE瀏覽器,沿用原來的...

    mindwind 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<