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;
}

 

成功:

posted @ 2021-10-13 16:13  jaychou、  阅读(294)  评论(0)    收藏  举报