[已解决]如何使用Laravel实现文件下载限速?

问题描述

项目要求说非VIP用户下载文件下要求限速。
我想到了Laravel的那个速率限制器,但很明显它并不能满足此需求,它只能适合用于对访问次数有限制的接口或页面。为此我可能需要Laravel实现此办法的思路。

解决方式

public function sliceDownload()
    {

        $path = 'slice/'.date('Ymd')  ;

        $filename = $path .'/'. '周杰伦 - 黑色幽默 [mqms2].mp3' ;

        //获取文件资源
        $file = Storage::disk('admin')->readStream($filename);

        //获取文件大小
        $fileSize = Storage::disk('admin')->size($filename);

        $request->headers->set("Content-type","application/octet-stream");//设定header头为下载
        $request->headers->set("Accept-Ranges","bytes");
        $request->headers->set("Accept-Length","".$fileSize);//响应大小
        $request->headers->set("Content-Disposition"," attachment; filename=".$filename);//文件名

        //不设置的话要等缓冲区满之后才会响应
        if (ob_get_contents())
            ob_end_clean();//缓冲区结束
        ob_implicit_flush();//强制每当有输出的时候,即刻把输出发送到浏览器\
        header('X-Accel-Buffering: no'); // 不缓冲数据

        $limit=1024*1024;
        $count=0;

        //限制每秒的速率
        while($fileSize-$count>0){//循环读取文件数据
            $data=fread($file,$limit);
            $count+=$limit;
            echo $data;//输出文件
            ob_flush();//增加的.  
            flush();
            sleep(1);
        }

    }

解答回报

每晚一句晚安#

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

sleep :joy:

vip多线程下载、非vip 限制线程数量
博客:大文件传输解决方案:分片上传 / 下载限速 我看站里这哥们写了

2年前 评论
威尼斯 (楼主) 2年前
讨论数量: 4

sleep :joy:

vip多线程下载、非vip 限制线程数量
博客:大文件传输解决方案:分片上传 / 下载限速 我看站里这哥们写了

2年前 评论
威尼斯 (楼主) 2年前

sleep是个好主意哈哈

2年前 评论
xiaochong0302

这么搞下载,拖死整个系统

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!