既然简单的文件上传已经会了,我们现在要对上传文件是否合法。因为上传文件不止一种,所以还需要封装一个类库
在Lib
目录下创建Upload
目录,用于存放上传文件类.Lib
在easySwoole
框架中没有是自己创建编写的哈~
在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
哈!上传测试.
可以看到是可以打出来的。还看不明白自己去研究哈~
看下源码
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);
}
上传文件测试.
可以看到有很多.但是我们现在只需要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();
测试结果也是成功的~
在获取文件名的时候调用的方法.
<?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;
}
}