既然简单的文件上传已经会了,我们现在要对上传文件是否合法。因为上传文件不止一种,所以还需要封装一个类库
QQ20190430-0.jpg
Lib目录下创建Upload目录,用于存放上传文件类.LibeasySwoole框架中没有是自己创建编写的哈~
Lib\Upload下创建Base.php公共类库.
先以视频为例吧,在Lib\Upload下创建Video.php继承Base.php.

<?php
/**
namespace App\Lib\Upload;
use App\Lib\Upload\Base;
class Video extends Base
{
    public $fileType = 'video';
    public $maxSize = 123123;
    public $fileExType = [
        'mp4',
        'x-flv',
        'jpeg'
    ];
}

Base.php逻辑:

public function __construct($request)
{
    $this->request = $request;
    print_r($this->request);
}

然后在接口中调用Lib\Upload\Video注意看啦~这里不是调用Base哈!上传测试.
11.png
可以看到是可以打出来的。还看不明白自己去研究哈~
看下源码12.png


function __construct(\swoole_http_request $request)
{
    $this->request = $request;
    //这里调用的方法自己看哈~就不贴出来了.
    $files = $this->initFiles();
    ...
}
function getSwooleRequest()
{
    return $this->request;
}        

修改我们的Base.php.

public function __construct($request)
{
    $this->request = $request;
    $files = $request->getSwooleRequest();
    print_r($files);
}

上传文件测试.
13.png
可以看到有很多.但是我们现在只需要files,注意!files.file是请求的健!传video就是video.
Base.php下的$file再接着调用一下files属性就好了.
我们现在需要获取上传的类型.也就是上传传参的健名

public function __construct($request)
{
    $this->request = $request;
    $files = $request->getSwooleRequest()->files;
    /*获取传参的健 video | image*/
    $types = array_keys($files);
    $this->type = $types[0];
}

检验上传文件的健名是否属于可接受的类型.

public function upload()
{
    $uploadType = $this->type;
    /*如果上传文件的类型 不等于video或image下的file_type属于上传错误*/
    if ($uploadType != $this->fileType) {
        return false;
    }
}

检验上传文件大小是否合法

$video = $this->request->getUploadedFile($uploadType);
$this->size = $video->getSize();
/*检测上传文件大小是否合法*/
$this->checkSize();
/*检测文件大小*/
public function checkSize()
{
    if (empty($this->size)) {
        return false;
    }
    /*这里可以在video/image设置大小。然后进行判断*/
    return true;
}

检测上传文件后缀名是否符合规范

/* xxx.jpeg 获取文件后缀名  */
$fileName = $video->getClientFilename(); //获取文件的所有参数
$this->clientMediaType = $video->getClientMediaType(); //获取后缀名
/*判断文件类型是否属于定义可上传的类型*/
$this->checkClientMediaType();
/*检测文件类型后缀名*/
public function checkClientMediaType()
{
    /* 输出image/jpeg */
    $clientMediaType = explode('/', $this->clientMediaType);
    $clientMediaType = $clientMediaType[1] ?? '';
    if (empty($clientMediaType)) {
        throw new \Exception("上传文件{$this->type}文件不合法");
    }
    /*不属于video | image类下面定义的类型为不合法文件*/
    if (!in_array($clientMediaType, $this->fileExType)) {
        throw new \Exception("上传文件{$this->type}文件不合法");
    }
    return true;
}

获取上传文件存放路径

$file = $this->getFile($fileName);
/*获取文件*/
public function getFile($fileName)
{
    $pathinfo = pathinfo($fileName);
    $extension = $pathinfo['extension'];
    $dirName = '/upload/' . $this->type . '/' . date('Y') . '/' . date('m') . '/';
    $dir = EASYSWOOLE_ROOT . '/website/upload/' . $this->type . '/' . date('Y') . '/' . date('m') . '/';
    if (!is_dir($dir)) {
        mkdir($dir, 0777, true);
    }
    $baseName = FileName::getFileKey($fileName) . '.' . $extension;
    $this->file = $dirName . $baseName;
    return $dir . $baseName;
}

移动文件

$flag = $video->moveTo($file);
if (empty($flag)) {
    return false;
}
return $this->file;

接口调用方式

$request = $this->request();
$obj = new Video($request); 
$file = $obj->upload();

测试结果也是成功的~
72B505B42BF72FBF25346FE3D81D335D.jpg
在获取文件名的时候调用的方法.

<?php
namespace App\Lib\Tools;
class FileName
{
    /**
     * 生成的唯一性key
     * @param string $str
     * @return string
     */
    public static function getFileKey($str) {
        return substr(md5(self::makeRandomString() . $str . time() . rand(0, 9999)), 8, 16);
    }

    /**
     * 生成随机字符串
     * @param string $length 长度
     * @return string 生成的随机字符串
     */
    public static function makeRandomString($length = 1) {

        $str = null;
        $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
        $max = strlen($strPol) - 1;

        for($i=0; $i<$length; $i++) {
            $str .= $strPol[rand(0,$max)];//rand($min,$max)生成介于min和max两个数之间的一个随机整数
        }
        return $str;
    }
}
Last modification:February 18th, 2020 at 10:39 pm