场景如下:
我们有一个服务端,一个商户端
服务端和商户端的框架都是用的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+端口号进行请求
是不是用了nginx代理,nginx配置估计有问题,贴配置
请求服务端没有使用任何第三方工具和服务,是直接通过IP地址+端口号进行请求的
自己实现的?参照官方的搞吧。最下面有返回文件流、下载
https://www.workerman.net/doc/webman/response.html
下载这个,我需要读取文件的下载进度返回给前端啊,官方这个不知道如何进行返回进度