test_lgq/niucloud/core/upload/BaseUpload.php
2024-01-24 17:36:08 +08:00

241 lines
6.3 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的saas管理平台
// +----------------------------------------------------------------------
// | 官方网址https://www.niucloud-admin.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace core\upload;
use core\exception\UploadFileException;
use core\loader\Storage;
/**
* Class BaseUpload
*/
abstract class BaseUpload extends Storage
{
protected $file;//上传的文件对象
protected $file_info;//上传的文件属性参数
protected $file_name;//新文件名
protected $name;
protected $full_file;//完整的文件地址
protected $full_path;
protected $validate;
protected $type;
protected $config;
//可能还需要一个完整路径
protected $storage_type;
/**
* 初始化
* @param array $config
* @return void
*/
protected function initialize(array $config = [])
{
$this->config = $config;
$this->storage_type = $config['storage_type'];
}
/**
* 附件上传
* @param string $dir
* @return mixed
*/
abstract protected function upload(string $dir);
/**
* 抓取远程附件
* @param string $url
* @param string|null $key
* @return mixed
*/
abstract protected function fetch(string $url, ?string $key);
/**
* base64文件上云
* @param string $base64_data
* @param string|null $key
* @return mixed
*/
abstract protected function base64(string $base64_data, ?string $key = null);
/**
* 附件删除
* @param string $file_name
* @return mixed
*/
abstract protected function delete(string $file_name);
/**
* 缩略图
* @param string $file_path
* @param $thumb_type
* @return mixed
*/
abstract protected function thumb(string $file_path, $thumb_type);
/**
* 读取文件
* @param string $name
* @param bool $is_rename
*/
public function read(string $name, bool $is_rename = true)
{
$this->name = $name;
$this->file = request()->file($name);
if (empty($this->file))
throw new UploadFileException(100012);
$this->file_info = [
'name' => $this->file->getOriginalName(),//文件原始名称
'mime' => $this->file->getOriginalMime(),//上传文件类型信息
'real_path' => $this->file->getRealPath(),//上传文件真实路径
'ext' => $this->file->getOriginalExtension(),//上传文件后缀
'size' => $this->file->getSize(),//上传文件大小
];
if ($is_rename) {
$this->file_name = $this->createFileName();
} else {
$this->file_name = $this->file_info['name'];
}
}
/**
* 设置文件类型
* @param string $type
* @return $this
*/
public function setType(string $type)
{
$this->type = $type;
return $this;
}
/**
* 校验文件是否合法
*/
public function check()
{
}
/**
* 生成新的文件名
* @return string
*/
public function createFileName(string $key = '', string $ext = '')
{
//DIRECTORY_SEPARATOR 常量
$storage_tag = '_' . $this->storage_type;
if (empty($key)) {
return time() . md5($this->file_info['real_path']) . $storage_tag . '.' . $this->file_info['ext'];
} else {
return time() . md5($key) . $storage_tag . '.' . $ext;
}
}
/**
* 获取原始附件信息
* @return mixed
*/
public function getFileInfo()
{
return $this->file_info;
}
/**
* 获取上传文件的真实完整路径
* @return mixed
*/
public function getRealPath()
{
return $this->file_info['real_path'];
}
/**
* 获取生成的文件完整地址
* @return string
*/
public function getFullPath(string $dir = '')
{
return $this->full_path ?: $this->concatFullPath($dir);
}
/**
* 合并路径和文件名
* @param string $dir
* @return string
*/
public function concatFullPath(string $dir = '')
{
$this->full_path = implode('/', array_filter([$dir, $this->getFileName()]));
return $this->full_path;
}
/**
* 获取文件名
* @return mixed
*/
public function getFileName()
{
return $this->file_name;
}
public function getUrl(string $path = '')
{
$path = !empty($path) ? $path : $this->getFullPath();
$domain = $this->config['domain'] ?? '';
$domain = empty($domain) ? '' : $domain . '/';
return $domain . $path;
}
/**
* 验证
* @param array $validate
* @return $this
*/
public function setValidate(array $validate = [])
{
$this->validate = $validate ?: config('upload.rules')[$this->type] ?? [];
return $this;
}
/**
* 根据上传文件的类型来校验文件是否符合配置
* @return void
*/
public function validate()
{
if (empty($this->file))
throw new UploadFileException('UPLOAD_FAIL');
$config['file_ext'] = $this->validate['ext'] ?? [];
$config['file_mime'] = $this->validate['mime'] ?? [];
$config['file_size'] = $this->validate['size'] ?? 0;
$rule = [];
$file_size = $config['file_size'] ?? 0;
if ($file_size > 0) {
$rule[] = 'fileSize:' . $file_size;
}
//验证上传文件类型
$file_mime = $config['file_mime'] ?? [];
$file_ext = $config['file_ext'] ?? [];
if (!empty($file_ext)) {
$rule[] = 'fileExt:' . implode(',', $file_ext);
}
if (!empty($rule)) {
if (!in_array($this->file->getOriginalMime(), $file_mime)) {
throw new UploadFileException('UPLOAD_TYPE_NOT_SUPPORT');
}
validate([$this->name => implode('|', $rule)])->check([$this->name => $this->file]);
}
}
}