在用webman做http接口服務(wù),開(kāi)發(fā)一款前后端分離的應(yīng)用
要實(shí)現(xiàn):用戶通過(guò)接口下載文件的功能,經(jīng)測(cè)試通過(guò)下面的方法的可以進(jìn)行下載:
```php
<?php
namespace app\controller;
use support\Request;
Class DownloadRep{
//下載備份文件
public function DownloadRepBackup(Request $request)
{
$filePath = "...";
return response()->download($filePath);
}
}
現(xiàn)在要實(shí)現(xiàn)大文件下載,可能是上百M(fèi),看到論壇有提供下面的下載方式,想請(qǐng)問(wèn)在上述控制器的任何一個(gè)方法內(nèi)能拿到$connection對(duì)象來(lái)使用嗎?對(duì)文檔提供的回調(diào)函數(shù)的用法不是很理解。
(或者說(shuō)在webman的控制器的函數(shù)中如何使用$conection對(duì)象(即TcpConnection實(shí)例))
<?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);
}
// 這里發(fā)送的是一個(gè)大的pdf文件,如果是其它格式的文件,請(qǐng)修改下面代碼中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;
}
// ======發(fā)送http頭======
$file_size = filesize($file_name);
//省略...
$connection->onBufferDrain = function($connection)use($do_write)
{
$connection->bufferFull = false;
$do_write();
};
// 執(zhí)行發(fā)送
$do_write();
}
Worker::runAll();
直接用 response()->download()
就行
感謝解答。可是我現(xiàn)在無(wú)論使用 response()->download() 還是 response()->file() 還是 response()->withFile() ,前端的下載都會(huì)卡在不超過(guò)2M的時(shí)候,下載沒(méi)有結(jié)束沒(méi)有報(bào)錯(cuò)但是就是一直下載加載中,我用前端的請(qǐng)求方法請(qǐng)求另外的文件下載接口,就可以正常下載,請(qǐng)問(wèn)是否為webman哪里的配置信息需要更改嗎?
我這測(cè)試正常。測(cè)試代碼
<?php
namespace app\controller;
use support\Request;
class Index
{
public function index(Request $request)
{
return response('')->download(public_path(). '/1.zip');
}
}
1.zip 大概10M
webman不支持使用使用$connection對(duì)象,不過(guò)你可以在webman里自定義進(jìn)程,webman自定義進(jìn)程和workerman使用起來(lái)幾本沒(méi)有區(qū)別