easyswoole 简单实现单文件多文件上传
封装文件上传类:
点击查看代码
<?php
namespace App\Common\upload;
use Co\Channel;
use EasySwoole\Component\Csp;
use EasySwoole\Utility\MimeType;
use EasySwoole\Utility\Random;
use function PHPUnit\Framework\throwException;
class FileUpload
{
/**
* 单文件上传
* @param $file // 单文件对象
* @param $catalog // 目录
*/
public function upload($file, $catalog)
{
try {
if (!$file || is_array($file)) // 验证1
return failArr(0, '文件为空');
$type = $file->getClientMediaType(); // image/jpg
$suffix = MimeType::getExtByMimeType($type); // .jpg
$this->fileValid($file, $suffix); // 验证2
$path = $this->getFile($suffix, $catalog); //设置保存文件路径
$file->moveTo($path);//保存文件
return sucArr(['filePath' => $path]);
} catch (\Exception $e) {
return failArr(0, $e->getMessage());
}
}
/**
* 多文件上传
* @param $files // 多文件对象
* @param $catalog // 目录
*/
public function uploads($files, $catalog)
{
if (!(is_array($files) && count($files)))
return failArr(0, '文件为空');
foreach ($files as $k => $file){
$type = $file->getClientMediaType(); // image/jpg
$suffix = MimeType::getExtByMimeType($type); // .jpg
$err = $this->fileValid($file, $suffix); // 验证大小类型
if ($err){
return failArr(0, $err);
break;
}
}
$channel = new \Swoole\Coroutine\Channel(count($files)); // 管道,用于协程数据超传输
go(function () use ($files, $catalog,$channel, &$arr) {
try {
$wait = new \EasySwoole\Component\WaitGroup(count($files)); // 开启一个协程组
foreach ($files as $k => $file) {
$wait->add();
go(function () use ($file, $catalog,$wait, &$arr) {
$type = $file->getClientMediaType(); // image/jpg
$suffix = MimeType::getExtByMimeType($type); // .jpg
$path = $this->getFile($suffix, $catalog); //设置保存文件路径
$file->moveTo($path); //保存文件
$arr[] = $path;
$wait->done();
});
}
$wait->wait(); // 等待协程组执行
$channel->push(sucArr(['filePath' => $arr]));
} catch (\Exception $e) {
$wait->close();
$channel->close();
return failArr(0, $e->getMessage());
}
});
$res = $channel->pop(); // 取出数据
$channel->close(); // 关闭
return $res;
}
/**
* 验证文件类型和大小
* @param $file // 单文件
* @param $suffix // 后缀
*/
public function fileValid($file, $suffix)
{
if (!in_array($suffix, ['.png', '.jpg', '.bmp', '.gif', 'tiff'])) // 验证
return '文件类型不符合';
else
if ($file->getSize() > 10 * 1024 * 1024)
return '上传文件不能超过10M';
return false;
}
/**
* 判断图片路径是否存在
* @param $suffix // 后缀 .jpg
* @param $catalog // 目录名 admin
* @return string 完整路径
*/
public function getFile($suffix, $catalog)
{
$dir = EASYSWOOLE_ROOT . '/' . $catalog . '/' . date('Y-m-d');
if (!is_dir($dir))
mkdir($dir, 0777, true);
$basename = '/' . md5(time()) . Random::number(6) . $suffix;
return $dir . $basename;
}
}
放入IOC容器:
$di = Di::getInstance();
$di->set('uploadUtil',new FileUpload);
使用:
public function upload()
{
// 单文件
$file = $this->request()->getUploadedFile('file') ?? '';
Di::getInstance()->get('uploadUtil')->upload($file, 'oneFile');
// 多文件
$files = $this->request()->getUploadedFiles()['files'] ?? [];
$res = Di::getInstance()->get('uploadUtil')->uploads($files, 'manyFile');
jsonApi($this->response(),$res);
return true;
}
成功:


浙公网安备 33010602011771号