[已解决]如何使用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);
        }

    }

解答回报

每晚一句晚安#

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

sleep :joy:

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

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

sleep :joy:

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

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

sleep是个好主意哈哈

1年前 评论
xiaochong0302

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

1年前 评论

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