catchAdmin/extend/catcher/CatchUpload.php

301 lines
6.4 KiB
PHP
Raw Normal View History

2020-01-25 22:22:56 +08:00
<?php
2020-11-29 09:29:14 +08:00
declare(strict_types=1);
2020-01-25 22:22:56 +08:00
namespace catcher;
use catchAdmin\system\model\Attachments;
2020-04-21 17:07:19 +08:00
use catchAdmin\system\model\Config;
2020-02-02 22:10:14 +08:00
use catcher\exceptions\FailedException;
use catcher\exceptions\ValidateFailedException;
use think\exception\ValidateException;
2020-01-25 22:22:56 +08:00
use think\facade\Filesystem;
use think\file\UploadedFile;
class CatchUpload
{
/**
* 阿里云
*/
public const OSS = 'oss';
/**
* 腾讯云
*/
public const QCLOUD = 'qcloud';
/**
* 七牛
*/
public const QIQNIU = 'qiniu';
/**
2020-07-29 07:29:42 +08:00
* 驱动
2020-01-25 22:22:56 +08:00
*
* @var string
*/
2020-07-29 07:29:42 +08:00
protected $driver;
2020-01-25 22:22:56 +08:00
/**
* 本地
*/
public const LOCAL = 'local';
/**
* path
*
* @var string
*/
protected $path = '';
2020-09-07 08:29:12 +08:00
/**
2020-09-08 14:10:27 +08:00
* upload files
*
* @param UploadedFile $file
* @return string
* @author JaguarJack
* @email njphper@gmail.com
* @time 2020/1/25
*/
2020-02-02 22:10:14 +08:00
public function upload(UploadedFile $file): string
2020-01-25 22:22:56 +08:00
{
2021-01-20 20:12:08 +08:00
try {
$this->initUploadConfig();
2020-04-21 17:07:19 +08:00
2021-01-20 20:12:08 +08:00
$path = Filesystem::disk($this->getDriver())->putFile($this->getPath(), $file);
2020-01-25 22:22:56 +08:00
2021-01-20 20:12:08 +08:00
if ($path) {
2020-06-28 08:34:19 +08:00
2021-01-20 20:12:08 +08:00
$url = self::getCloudDomain($this->getDriver()) . '/' . $this->getLocalPath($path);
2020-02-02 22:10:14 +08:00
2021-01-20 20:12:08 +08:00
event('attachment', [
'path' => $path,
'url' => $url,
'driver' => $this->getDriver(),
'file' => $file,
]);
2020-02-02 22:10:14 +08:00
2021-01-20 20:12:08 +08:00
return $url;
}
throw new FailedException('Upload Failed, Try Again!');
2020-02-02 22:10:14 +08:00
2021-01-20 20:12:08 +08:00
} catch (\Exception $exception) {
throw new FailedException($exception->getMessage());
}
2020-02-02 22:10:14 +08:00
}
2020-09-07 08:29:12 +08:00
/**
* 本地路径
*
* @time 2020年09月07日
* @param $path
* @return string
*/
2020-06-28 08:34:19 +08:00
protected function getLocalPath($path)
{
if ($this->getDriver() === self::LOCAL) {
2020-09-08 19:54:05 +08:00
$path = str_replace(root_path('public'), '', \config('filesystem.disks.local.root')) . DIRECTORY_SEPARATOR .$path;
return str_replace('\\', '/', $path);
2020-06-28 08:34:19 +08:00
}
return $path;
}
2020-02-02 22:10:14 +08:00
/**
* 多文件上传
*
* @author JaguarJack
* @email njphper@gmail.com
* @time 2020/2/1
* @param $attachments
* @return array|string
*/
public function multiUpload($attachments)
{
if (!is_array($attachments)) {
return $this->upload($attachments);
}
$paths = [];
foreach ($attachments as $attachment) {
$paths[] = $this->upload($attachment);
2020-01-25 22:22:56 +08:00
}
2020-02-02 22:10:14 +08:00
return $paths;
2020-01-25 22:22:56 +08:00
}
/**
* get upload driver
*
* @author JaguarJack
* @email njphper@gmail.com
* @time 2020/1/25
* @return string
*/
protected function getDriver(): string
{
2020-07-29 07:29:42 +08:00
if ($this->driver) {
return $this->driver;
}
return \config('filesystem.default');
2020-01-25 22:22:56 +08:00
}
/**
* set driver
*
* @author JaguarJack
* @email njphper@gmail.com
* @time 2020/1/25
* @param $driver
* @throws \Exception
* @return $this
*/
public function setDriver($driver): self
{
if (!in_array($driver, [self::OSS, self::QCLOUD, self::QIQNIU, self::LOCAL])) {
throw new \Exception(sprintf('Upload Driver [%s] Not Supported', $driver));
}
$this->driver = $driver;
return $this;
}
/**
*
* @author JaguarJack
* @email njphper@gmail.com
* @time 2020/1/25
* @return string
*/
protected function getPath()
{
return $this->path;
}
/**
*
* @author JaguarJack
* @email njphper@gmail.com
* @time 2020/1/25
* @param string $path
* @return $this
*/
public function setPath(string $path)
{
$this->path = $path;
return $this;
}
2020-09-08 14:10:27 +08:00
/**
*
* @time 2020年01月25日
* @param UploadedFile $file
* @return array
*/
2020-01-25 22:22:56 +08:00
protected function data(UploadedFile $file)
{
return [
'file_size' => $file->getSize(),
'mime_type' => $file->getMime(),
2020-02-02 22:10:14 +08:00
'file_ext' => $file->getOriginalExtension(),
2020-01-25 22:22:56 +08:00
'filename' => $file->getOriginalName(),
'driver' => $this->getDriver(),
];
}
2020-02-02 22:10:14 +08:00
/**
* 验证图片
*
* @author JaguarJack
* @email njphper@gmail.com
* @time 2020/2/1
* @param array $images
* @return $this
*/
public function checkImages(array $images)
{
try {
validate(['image' => config('catch.upload.image')])->check($images);
} catch (ValidateException $e) {
throw new ValidateFailedException($e->getMessage());
}
return $this;
}
/**
* 验证文件
*
* @author JaguarJack
* @email njphper@gmail.com
* @time 2020/2/1
* @param array $files
* @return $this
*/
public function checkFiles(array $files)
{
try {
validate(['file' => config('catch.upload.file')])->check($files);
} catch (ValidateException $e) {
throw new ValidateFailedException($e->getMessage());
}
return $this;
}
2020-04-21 17:07:19 +08:00
2020-06-01 21:25:46 +08:00
/**
* 初始化配置
*
* @time 2020年06月01日
* @return void
*/
2021-03-01 21:01:37 +08:00
public function initUploadConfig()
2020-09-07 08:29:12 +08:00
{
2021-03-01 21:01:37 +08:00
Utils::setFilesystemConfig();
2020-09-07 08:29:12 +08:00
}
2020-04-29 09:02:43 +08:00
/**
* 获取云存储的域名
*
* @time 2020年01月25日
* @param $driver
* @return string
*/
public static function getCloudDomain($driver): ?string
{
$driver = \config('filesystem.disks.' . $driver);
switch ($driver['type']) {
case CatchUpload::QIQNIU:
case CatchUpload::LOCAL:
return $driver['domain'];
case CatchUpload::OSS:
2021-01-20 20:09:06 +08:00
return self::getOssDomain();
2020-04-29 09:02:43 +08:00
case CatchUpload::QCLOUD:
return $driver['cdn'];
default:
throw new FailedException(sprintf('Driver [%s] Not Supported.', $driver));
}
}
2021-01-20 20:09:06 +08:00
/**
* 获取 OSS Domain
*
* @time 2021年01月20日
* @return mixed|string
*/
protected static function getOssDomain(): string
{
$oss = \config('filesystem.disks.oss');
if ($oss['is_cname'] === false) {
return 'https://' . $oss['bucket'] . '.' . $oss['end_point'];
}
return $oss['end_point'];
}
2020-09-08 14:10:27 +08:00
}