webman下载大文件为啥不能超过2M呀?

楚羽幽

问题描述

场景如下:
我们有一个服务端,一个商户端
服务端和商户端的框架都是用的webman框架

服务端webman返回一个文件给商户端,然后商户端下载zip压缩包进行解压
并且商户端下载zip文件的时候,读取下载的进度并返回给前端显示下载进度
服务端返回的下载文件有50M,可是商户端下载的zip文件却只有2M

商户端是在webman的自定义进程中进行下载文件
然后用$connection对象实时输出返回下载进度给前端显示
不知道是因为什么导致的

服务端代码截图

商户端代码

    /**
     * 下载文件
     *
     * @Author 贵州猿创科技有限公司
     * @Email 416716328@qq.com
     * @DateTime 2023-03-25
     * @param  TcpConnection $connection
     * @param  array         $data
     * @param  array         $step
     * @return void
     */
    private function downloadFile(TcpConnection $connection, array $data, array $step)
    {
        $key = $data['key'];
        $format = $data['format'];
        // 获取安装文件
        $host = HttpService::$host;
        $url = "{$host}Plugin/install?key={$key}";
        // header
        $header = get_headers($url, true);
        // 检测文件大小
        if (!isset($header['Content-Length'])) {
            $this->sendRes($connection, [
                'code'      => 404,
                'msg'       => '插件ID错误',
            ], 'error');
            return;
        }
        // 文件大小(字节)
        $fileSize = $header['Content-Length'];
        // 远程文件
        $remote = fopen($url, 'rb');
        if (!$remote) {
            $this->sendRes($connection, [
                'code'      => 404,
                'msg'       => '远程源文件错误',
            ], 'error');
            return;
        }
        // 缓存文件路径
        $savePath = runtime_path("/temp.{$format}");
        // 本地文件
        $local = fopen($savePath, 'wb');
        if (!$local) {
            $this->sendRes($connection, [
                'code'      => 404,
                'msg'       => '本地源文件错误',
            ], 'error');
            return;
        }
        // 每次写入字节(1024=1kb)
        $chunk = 4096;
        // 分段读取文件
        $downlen = 0;
        while (!feof($remote)) {
            // 读取流
            $stream = fread($remote, $chunk);
            // 写入文件
            fwrite($local, $stream, $chunk);
            // 获得块大小
            $downlen += strlen($stream);
            // 计算百分比
            $percent = round($downlen / $fileSize * 100, 2);

            if ($percent < 100) {
                $this->sendRes($connection, ['progress' => $percent]);
            }
        }
        fclose($local);
        fclose($remote);
    }

商户端代码截图

请求服务端接口

请求接口没有使用到nginx,是直接用的IP+端口号进行请求

840 2 1
2个回答

six

是不是用了nginx代理,nginx配置估计有问题,贴配置

  • 楚羽幽 2023-03-27

    请求服务端没有使用任何第三方工具和服务,是直接通过IP地址+端口号进行请求的

ersic

自己实现的?参照官方的搞吧。最下面有返回文件流、下载
https://www.workerman.net/doc/webman/response.html

  • 楚羽幽 2023-03-27

    下载这个,我需要读取文件的下载进度返回给前端啊,官方这个不知道如何进行返回进度

年代过于久远,无法发表回答
🔝