资讯专栏INFORMATION COLUMN

【CLI】使用Curl下载文件实时进度条显示

sydMobile / 1301人阅读

摘要:最近在捣鼓命令行下的编程,下载文件总是一个难熬的过程,如果有进度条就好很多了先上一个进度条的扩展包,还是不错的还是挺好看的做为一个很常用的下载方式,这里简单的使用方式初始化一个设置请求的不直接输出,而是通过返回上面是一个很简单的例子,如

最近在捣鼓命令行下的编程,下载文件总是一个难熬的过程,如果有进度条就好很多了!!!


先上一个进度条的扩展包,还是不错的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);

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/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元查看
<