在用webman做http接口服务,开发一款前后端分离的应用
要实现:用户通过接口下载文件的功能,经测试通过下面的方法的可以进行下载:
```php
<?php
namespace app\controller;
use support\Request;
Class DownloadRep{
//下载备份文件
public function DownloadRepBackup(Request $request)
{
$filePath = "...";
return response()->download($filePath);
}
}
现在要实现大文件下载,可能是上百M,看到论坛有提供下面的下载方式,想请问在上述控制器的任何一个方法内能拿到$connection对象来使用吗?对文档提供的回调函数的用法不是很理解。
(或者说在webman的控制器的函数中如何使用$conection对象(即TcpConnection实例))
<?php
use Workerman\Worker;
require_once './Workerman/Autoloader.php';
$worker = new Worker('http://0.0.0.0:4236');
$worker->onMessage = function($connection, $data)
{
if($_SERVER == '/favicon.ico')
{
return $connection->send("HTTP/1.0 404 Not Found\r\nContent-Length: 0\r\n\r\n", true);
}
// 这里发送的是一个大的pdf文件,如果是其它格式的文件,请修改下面代码中http头
send_file($connection, "/your/path/xxx.pdf");
};
function send_file($connection, $file_name)
{
if(!is_file($file_name))
{
$connection->send("HTTP/1.0 404 File Not Found\r\nContent-Length: 18\r\n\r\n404 File Not Found", true);
return;
}
// ======发送http头======
$file_size = filesize($file_name);
//省略...
$connection->onBufferDrain = function($connection)use($do_write)
{
$connection->bufferFull = false;
$do_write();
};
// 执行发送
$do_write();
}
Worker::runAll();
直接用
response()->download()
就行感谢解答。可是我现在无论使用 response()->download() 还是 response()->file() 还是 response()->withFile() ,前端的下载都会卡在不超过2M的时候,下载没有结束没有报错但是就是一直下载加载中,我用前端的请求方法请求另外的文件下载接口,就可以正常下载,请问是否为webman哪里的配置信息需要更改吗?
我这测试正常。测试代码
1.zip 大概10M
webman不支持使用使用$connection对象,不过你可以在webman里自定义进程,webman自定义进程和workerman使用起来几本没有区别
非常感谢walkor,我继续探索下自定义进程的用法
下载文件大于2M左右就出现网络错误,在linux服务器下还是存在
需要更新 PHP 和 ngin 相关配置才行
能把数据流放在file()方法里面吗?因为我上传的时候加密了,得解密后把数据流发送到客户端
请问有无实现方案?
老哥,你这个找到解决办法了吗? 我也是遇到了这个问题
https://www.workerman.net/q/10320