Merge branch 'dev' of https://gitea.f2b211.com/jsasg/orico-official-website into dev
This commit is contained in:
14
.example.env
14
.example.env
@@ -26,6 +26,13 @@ TTL=3600
|
|||||||
REFRESH_TTL=20160
|
REFRESH_TTL=20160
|
||||||
SECRET=b43e6276644ed60e65c50d1b324ba10b
|
SECRET=b43e6276644ed60e65c50d1b324ba10b
|
||||||
|
|
||||||
|
# 七牛云存储配置
|
||||||
|
[QINIU_CLOUD]
|
||||||
|
BUCKET = orico-official-website
|
||||||
|
BASE_URL = //ow.static.f2b211.com
|
||||||
|
ACCESS_KEY = dOsTum4a5qvhPTBbZRPX0pIOU7PZWRX7htKjztms
|
||||||
|
SECRET_KEY = KFxsGbnErkALFfeGdMa8QWTdodJbamMX0iznLe-q
|
||||||
|
|
||||||
# 后台不需要登录的接口
|
# 后台不需要登录的接口
|
||||||
[ADMIN_AUTH]
|
[ADMIN_AUTH]
|
||||||
WHITE_LIST[] = v1/user/login
|
WHITE_LIST[] = v1/user/login
|
||||||
@@ -47,6 +54,13 @@ REFRESH_TOKEN_LIFETIME = 1209600; # 刷新令牌有效期
|
|||||||
RESOURCE_IMAGES_DOMAIN = http://local.orico.com; # 图片资源服务器地址
|
RESOURCE_IMAGES_DOMAIN = http://local.orico.com; # 图片资源服务器地址
|
||||||
RESOURCE_VIDEOS_DOMAIN = http://local.orico.com; # 视频资源服务器地址
|
RESOURCE_VIDEOS_DOMAIN = http://local.orico.com; # 视频资源服务器地址
|
||||||
|
|
||||||
|
# 七牛云存储配置
|
||||||
|
[QINUI]
|
||||||
|
BUCKET = orico
|
||||||
|
BASE_URL = http://local.orico.com
|
||||||
|
ACCESS_KEY = 1234567890
|
||||||
|
SECRET_KEY = 1234567890
|
||||||
|
|
||||||
# 前台视图模板规则配置
|
# 前台视图模板规则配置
|
||||||
[INDEX_VIEW_TPL]
|
[INDEX_VIEW_TPL]
|
||||||
# 视图目录
|
# 视图目录
|
||||||
|
|||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -8,6 +8,8 @@ Thumbs.db
|
|||||||
.env.local
|
.env.local
|
||||||
.env.prod
|
.env.prod
|
||||||
|
|
||||||
|
public/dist
|
||||||
|
public/opendoc
|
||||||
/.idea
|
/.idea
|
||||||
/.vscode
|
/.vscode
|
||||||
/vendor
|
/vendor
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ use app\admin\model\v1\SysAttachmentUploadRecordModel;
|
|||||||
use Intervention\Image\ImageManager;
|
use Intervention\Image\ImageManager;
|
||||||
use Intervention\Image\Typography\FontFactory;
|
use Intervention\Image\Typography\FontFactory;
|
||||||
use think\facade\Filesystem;
|
use think\facade\Filesystem;
|
||||||
|
use filesystem\Qiniu;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 文件上传控制器
|
* 文件上传控制器
|
||||||
@@ -153,8 +154,8 @@ class Upload
|
|||||||
$image_model = new SysImageUploadRecordModel();
|
$image_model = new SysImageUploadRecordModel();
|
||||||
$image_model->language_id = request()->lang_id;
|
$image_model->language_id = request()->lang_id;
|
||||||
$image_model->module = $param['module'];
|
$image_model->module = $param['module'];
|
||||||
$image_model->image_path = $filename;
|
$image_model->image_path = $storage . '/' . $filename;
|
||||||
$image_model->image_thumb = $thumb_filename;
|
$image_model->image_thumb = $storage . '/' . $thumb_filename;
|
||||||
$image_model->file_size = $file_size;
|
$image_model->file_size = $file_size;
|
||||||
$image_model->file_type = $mime_type;
|
$image_model->file_type = $mime_type;
|
||||||
$image_model->file_md5 = $filemd5;
|
$image_model->file_md5 = $filemd5;
|
||||||
@@ -165,8 +166,8 @@ class Upload
|
|||||||
}
|
}
|
||||||
|
|
||||||
return success('操作成功', [
|
return success('操作成功', [
|
||||||
'path' => $storage . '/' . $image_model->image_path,
|
'path' => $image_model->image_path,
|
||||||
'thumb_path' => $storage . '/' . $image_model->image_thumb,
|
'thumb_path' => $image_model->image_thumb,
|
||||||
'filemd5' => $image_model->file_md5,
|
'filemd5' => $image_model->file_md5,
|
||||||
'filesha1' => $image_model->file_sha1
|
'filesha1' => $image_model->file_sha1
|
||||||
]);
|
]);
|
||||||
@@ -226,6 +227,7 @@ class Upload
|
|||||||
'filename_keep' => (int)data_get($options, 'filename_keep.value', 0) == 1,
|
'filename_keep' => (int)data_get($options, 'filename_keep.value', 0) == 1,
|
||||||
'filemd5_unique' => (int)data_get($options, 'filemd5_unique.value', 0) == 1,
|
'filemd5_unique' => (int)data_get($options, 'filemd5_unique.value', 0) == 1,
|
||||||
'filetype_to' => data_get($options, 'filetype_to.value', 'original'),
|
'filetype_to' => data_get($options, 'filetype_to.value', 'original'),
|
||||||
|
'save_to' => data_get($options, 'save_to.value', 'local'),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@@ -345,20 +347,35 @@ class Upload
|
|||||||
// 获取视频上传配置
|
// 获取视频上传配置
|
||||||
list(
|
list(
|
||||||
'filename_keep' => $filename_keep,
|
'filename_keep' => $filename_keep,
|
||||||
'filemd5_unique' => $filemd5_unique
|
'filemd5_unique' => $filemd5_unique,
|
||||||
|
'save_to' => $save_to,
|
||||||
) = $this->getUploadOptions('upload_video');
|
) = $this->getUploadOptions('upload_video');
|
||||||
// 是否需要根据文件MD5值检查文件是否已存在
|
// 是否需要根据文件MD5值检查文件是否已存在
|
||||||
$video = $filemd5_unique ? SysVideoUploadRecordModel::md5($filemd5)->find() : null;
|
$video = $filemd5_unique ? SysVideoUploadRecordModel::md5($filemd5)->find() : null;
|
||||||
if (is_null($video)) {
|
if (is_null($video)) {
|
||||||
|
// 保存位置配置 key
|
||||||
|
$disk = 'video';
|
||||||
// 检查是否需要保留原文件名
|
// 检查是否需要保留原文件名
|
||||||
$name_rule = fn() => $filename_keep ? $this->filenameGenerator($file) : null;
|
$name_rule = fn() => $filename_keep ? $this->filenameGenerator($file) : null;
|
||||||
$filename = Filesystem::disk('video')->putFile($param['module'], $file, $name_rule());
|
|
||||||
|
// 保存到七牛云
|
||||||
|
if ($save_to == 'qiniu_cloud') {
|
||||||
|
$disk = 'video_qiniu';
|
||||||
|
$storage = config('filesystem.disks.video_qiniu.path_prefix');
|
||||||
|
}
|
||||||
|
$filename = Filesystem::disk($disk)->putFile($param['module'], $file, $name_rule());
|
||||||
|
|
||||||
|
// 组装视频路径
|
||||||
|
$video_path = $storage . '/' . $filename;
|
||||||
|
if ($save_to == 'qiniu_cloud') {
|
||||||
|
$video_path = Filesystem::disk($disk)->url($filename);
|
||||||
|
}
|
||||||
|
|
||||||
// 保存视频
|
// 保存视频
|
||||||
$video = new SysVideoUploadRecordModel();
|
$video = new SysVideoUploadRecordModel();
|
||||||
$video->language_id = request()->lang_id;
|
$video->language_id = request()->lang_id;
|
||||||
$video->module = $param['module'];
|
$video->module = $param['module'];
|
||||||
$video->video_path = $filename;
|
$video->video_path = $video_path;
|
||||||
$video->file_size = $file->getSize();
|
$video->file_size = $file->getSize();
|
||||||
$video->file_type = $file->getOriginalMime();
|
$video->file_type = $file->getOriginalMime();
|
||||||
$video->file_md5 = $filemd5;
|
$video->file_md5 = $filemd5;
|
||||||
@@ -369,7 +386,7 @@ class Upload
|
|||||||
}
|
}
|
||||||
|
|
||||||
return success('上传成功', [
|
return success('上传成功', [
|
||||||
'path' => $storage . '/' . $video->video_path,
|
'path' => $video->video_path,
|
||||||
'file_md5' => $video->file_md5,
|
'file_md5' => $video->file_md5,
|
||||||
'file_sha1' => $video->file_sha1
|
'file_sha1' => $video->file_sha1
|
||||||
]);
|
]);
|
||||||
@@ -399,25 +416,42 @@ class Upload
|
|||||||
return error($validate->getError());
|
return error($validate->getError());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$storage = config('filesystem.disks.public.url');
|
||||||
|
|
||||||
$filemd5 = $file->md5();
|
$filemd5 = $file->md5();
|
||||||
$filesha1 = $file->sha1();
|
$filesha1 = $file->sha1();
|
||||||
|
|
||||||
// 获取附件上传配置
|
// 获取附件上传配置
|
||||||
list(
|
list(
|
||||||
'filename_keep' => $filename_keep,
|
'filename_keep' => $filename_keep,
|
||||||
'filemd5_unique' => $filemd5_unique
|
'filemd5_unique' => $filemd5_unique,
|
||||||
|
'save_to' => $save_to
|
||||||
) = $this->getUploadOptions('upload_attachment');
|
) = $this->getUploadOptions('upload_attachment');
|
||||||
// 是否需要根据文件MD5值检查文件是否已存在
|
// 是否需要根据文件MD5值检查文件是否已存在
|
||||||
$attachment = $filemd5_unique ? SysAttachmentUploadRecordModel::md5($filemd5)->find() : null;
|
$attachment = $filemd5_unique ? SysAttachmentUploadRecordModel::md5($filemd5)->find() : null;
|
||||||
if (is_null($attachment)) {
|
if (is_null($attachment)) {
|
||||||
|
// 保存位置配置 key
|
||||||
|
$disk = 'public';
|
||||||
// 检查是否需要保留原文件名
|
// 检查是否需要保留原文件名
|
||||||
$name_rule = fn() => $filename_keep ? $this->filenameGenerator($file) : null;
|
$name_rule = fn() => $filename_keep ? $this->filenameGenerator($file) : null;
|
||||||
$filename = Filesystem::disk('public')->putFile('attachments', $file, $name_rule());
|
|
||||||
|
|
||||||
// 保存视频
|
// 保存到七牛云
|
||||||
|
if ($save_to == 'qiniu_cloud') {
|
||||||
|
$disk = 'public_qiniu';
|
||||||
|
$storage = config('filesystem.disks.public_qiniu.path_prefix');
|
||||||
|
}
|
||||||
|
$filename = Filesystem::disk($disk)->putFile('attachments', $file, $name_rule());
|
||||||
|
|
||||||
|
// 组装附件路径
|
||||||
|
$attachment_path = $storage . '/' . $filename;
|
||||||
|
if ($save_to == 'qiniu_cloud') {
|
||||||
|
$attachment_path = Filesystem::disk($disk)->url($filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 保存附件
|
||||||
$attachment = new SysAttachmentUploadRecordModel();
|
$attachment = new SysAttachmentUploadRecordModel();
|
||||||
$attachment->language_id = request()->lang_id;
|
$attachment->language_id = request()->lang_id;
|
||||||
$attachment->attachment_path = $filename;
|
$attachment->attachment_path = $attachment_path;
|
||||||
$attachment->file_size = $file->getSize();
|
$attachment->file_size = $file->getSize();
|
||||||
$attachment->file_type = $file->getOriginalMime();
|
$attachment->file_type = $file->getOriginalMime();
|
||||||
$attachment->file_md5 = $filemd5;
|
$attachment->file_md5 = $filemd5;
|
||||||
@@ -427,9 +461,8 @@ class Upload
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$storage = config('filesystem.disks.public.url');
|
|
||||||
return success('上传成功', [
|
return success('上传成功', [
|
||||||
'path' => $storage . '/' . $attachment->attachment_path,
|
'path' => $attachment->attachment_path,
|
||||||
'file_md5' => $attachment->file_md5,
|
'file_md5' => $attachment->file_md5,
|
||||||
'file_sha1' => $attachment->file_sha1
|
'file_sha1' => $attachment->file_sha1
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -144,4 +144,50 @@ if (!function_exists('thumb')) {
|
|||||||
|
|
||||||
return mb_substr($url, 0, $idx, 'utf-8') . '_thumb' . mb_substr($url, $idx, $len - $idx, 'utf-8');
|
return mb_substr($url, 0, $idx, 'utf-8') . '_thumb' . mb_substr($url, $idx, $len - $idx, 'utf-8');
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!function_exists('get_filesystem_url')) {
|
||||||
|
/**
|
||||||
|
* 获取文件系统的访问 URL
|
||||||
|
* @param string $url 文件地址
|
||||||
|
* @param string $disk 磁盘配置 key
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function get_filesystem_url(string $url, string $disk): string
|
||||||
|
{
|
||||||
|
if (\think\helper\Str::startsWith($url, ['http://', 'https://'])) {
|
||||||
|
return $url;
|
||||||
|
}
|
||||||
|
if (empty($disk)) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
return \think\facade\Filesystem::disk($disk)->url($url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!function_exists('url_filesystem_detect')) {
|
||||||
|
/**
|
||||||
|
* 检测文件地址并根据情况转换为文件系统地址
|
||||||
|
* @param string $url 文件地址
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function url_filesystem_detect(string $url): string
|
||||||
|
{
|
||||||
|
$idx = strrpos($url, '.');
|
||||||
|
if ($idx === false) {
|
||||||
|
return $url;
|
||||||
|
}
|
||||||
|
|
||||||
|
$disks = [
|
||||||
|
'public_qiniu' => '_' . base64_encode('public_qiniu'),
|
||||||
|
'video_qiniu' => '_' . base64_encode('video_qiniu')
|
||||||
|
];
|
||||||
|
foreach ($disks as $disk => $marker) {
|
||||||
|
if (str_ends_with(mb_substr($url, 0, $idx), $marker)) {
|
||||||
|
return get_filesystem_url($url, $disk);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $url;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -26,8 +26,6 @@ class Attachment extends Common
|
|||||||
'size/d' => 12,
|
'size/d' => 12,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 获取附件分类
|
// 获取附件分类
|
||||||
$categorys = AttachmentCategoryModel::field([
|
$categorys = AttachmentCategoryModel::field([
|
||||||
'id',
|
'id',
|
||||||
@@ -61,6 +59,16 @@ class Attachment extends Common
|
|||||||
'id' => $param['id']??null
|
'id' => $param['id']??null
|
||||||
]
|
]
|
||||||
]);
|
]);
|
||||||
|
if (!$attachements->isEmpty()) {
|
||||||
|
$attachements->each(function($item) {
|
||||||
|
if (is_array($item->attach)) {
|
||||||
|
$item->attach = array_map(function($v) {
|
||||||
|
$v['file_path'] = url_filesystem_detect($v['file_path']);
|
||||||
|
return $v;
|
||||||
|
}, $item->attach);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
View::assign('attachements', $attachements);
|
View::assign('attachements', $attachements);
|
||||||
View::assign('page', $attachements->render());
|
View::assign('page', $attachements->render());
|
||||||
|
|
||||||
@@ -124,6 +132,9 @@ class Attachment extends Common
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
if (!$videos->isEmpty()) {
|
if (!$videos->isEmpty()) {
|
||||||
|
$videos->each(function($item) {
|
||||||
|
$item->video = url_filesystem_detect($item->video);
|
||||||
|
});
|
||||||
$videos->setCollection($videos->getCollection()->chunk(2));
|
$videos->setCollection($videos->getCollection()->chunk(2));
|
||||||
}
|
}
|
||||||
View::assign('videos', $videos);
|
View::assign('videos', $videos);
|
||||||
|
|||||||
@@ -21,9 +21,9 @@
|
|||||||
],
|
],
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=8.0.0",
|
"php": ">=8.0.0",
|
||||||
"topthink/framework": "^8.0",
|
"topthink/framework": "8.1.2",
|
||||||
"topthink/think-orm": "v3.0.34",
|
"topthink/think-orm": "v3.0.34",
|
||||||
"topthink/think-filesystem": "^2.0",
|
"topthink/think-filesystem": "^3.0",
|
||||||
"topthink/think-multi-app": "^1.1",
|
"topthink/think-multi-app": "^1.1",
|
||||||
"topthink/think-migration": "^3.1",
|
"topthink/think-migration": "^3.1",
|
||||||
"topthink/think-view": "^2.0",
|
"topthink/think-view": "^2.0",
|
||||||
|
|||||||
@@ -39,6 +39,60 @@ return [
|
|||||||
// 可见性
|
// 可见性
|
||||||
'visibility' => 'public',
|
'visibility' => 'public',
|
||||||
],
|
],
|
||||||
|
'public_qiniu' => [
|
||||||
|
// 磁盘类型
|
||||||
|
'type' => \filesystem\driver\Qiniu::class,
|
||||||
|
// bucker 名称
|
||||||
|
'bucket' => env('QINIU_CLOUD.BUCKET', 'orico-official-website'),
|
||||||
|
// 访问密钥
|
||||||
|
'access_key' => env('QINIU_CLOUD.ACCESS_KEY', 'dOsTum4a5qvhPTBbZRPX0pIOU7PZWRX7htKjztms'),
|
||||||
|
// 密钥
|
||||||
|
'secret_key' => env('QINIU_CLOUD.SECRET_KEY', 'KFxsGbnErkALFfeGdMa8QWTdodJbamMX0iznLe-q'),
|
||||||
|
// 外部URL
|
||||||
|
'base_url' => env('QINIU_CLOUD.BASE_URL', '//szw73dlk3.hn-bkt.clouddn.com'),
|
||||||
|
// 路径
|
||||||
|
'path_prefix' => '/storage',
|
||||||
|
// 文件名称回调,可为文件名添加特定标志,以便可以在后续识别
|
||||||
|
'filename_generator' => function (\think\file\UploadedFile $file, callable $context_generator = null): callable {
|
||||||
|
return function() use ($file, $context_generator) {
|
||||||
|
// 为文件名称添加配置名,以为后续可能根据文件名识别文件所属存储配置信息
|
||||||
|
$marker = '_' . base64_encode('public_qiniu');
|
||||||
|
$filename = $context_generator ? $context_generator($file) : null;
|
||||||
|
if ($filename == null) {
|
||||||
|
return date('Ymd') . '/' . md5(microtime(true) . $file->getPathname()) . $marker;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $filename . $marker;
|
||||||
|
};
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'video_qiniu' => [
|
||||||
|
// 磁盘类型
|
||||||
|
'type' => \filesystem\driver\Qiniu::class,
|
||||||
|
// bucker 名称
|
||||||
|
'bucket' => env('QINIU_CLOUD.BUCKET', 'orico-official-website'),
|
||||||
|
// 访问密钥
|
||||||
|
'access_key' => env('QINIU_CLOUD.ACCESS_KEY', 'dOsTum4a5qvhPTBbZRPX0pIOU7PZWRX7htKjztms'),
|
||||||
|
// 密钥
|
||||||
|
'secret_key' => env('QINIU_CLOUD.SECRET_KEY', 'KFxsGbnErkALFfeGdMa8QWTdodJbamMX0iznLe-q'),
|
||||||
|
// 外部URL
|
||||||
|
'base_url' => env('QINIU_CLOUD.BASE_URL', '//szw73dlk3.hn-bkt.clouddn.com'),
|
||||||
|
// 路径
|
||||||
|
'path_prefix' => '/storage/videos',
|
||||||
|
// 文件名称回调,可为文件名添加特定标志,以便可以在后续识别
|
||||||
|
'filename_generator' => function (\think\file\UploadedFile $file, callable $context_generator = null): callable {
|
||||||
|
return function() use ($file, $context_generator) {
|
||||||
|
// 为文件名称添加配置名,以为后续可能根据文件名识别文件所属存储配置信息
|
||||||
|
$marker = '_' . base64_encode('video_qiniu');
|
||||||
|
$filename = $context_generator ? $context_generator() : null;
|
||||||
|
if ($filename == null) {
|
||||||
|
return date('Ymd') . '/' . md5(microtime(true) . $file->getPathname()) . $marker;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $filename . $marker;
|
||||||
|
};
|
||||||
|
},
|
||||||
|
]
|
||||||
// 更多的磁盘配置信息
|
// 更多的磁盘配置信息
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -119,6 +119,10 @@ class SysConfigInit extends Seeder
|
|||||||
["id" => 102, "group_id" => 13, "title" => "视频 - 唯一性保持", "name" => "upload_video.filemd5_unique", "value" => "1", "extra" => "0:否\n1:是", "type" => "radio", "sort" => 5, "remark" => "如果保持视频文件唯一,重复视频上传时将立即返回已存在的地址;如果不保持,则同模块同一天上传的文件根据原文件名覆盖。", "created_at" => "2025-06-12 11:24:24", "updated_at" => "2025-06-12 11:25:18", "deleted_at" => NULL],
|
["id" => 102, "group_id" => 13, "title" => "视频 - 唯一性保持", "name" => "upload_video.filemd5_unique", "value" => "1", "extra" => "0:否\n1:是", "type" => "radio", "sort" => 5, "remark" => "如果保持视频文件唯一,重复视频上传时将立即返回已存在的地址;如果不保持,则同模块同一天上传的文件根据原文件名覆盖。", "created_at" => "2025-06-12 11:24:24", "updated_at" => "2025-06-12 11:25:18", "deleted_at" => NULL],
|
||||||
["id" => 103, "group_id" => 13, "title" => "附件 - 保留原文件名", "name" => "upload_attachment.filename_keep", "value" => NULL, "extra" => "0:否\n1:是", "type" => "radio", "sort" => 6, "remark" => "默认为否", "created_at" => "2025-06-12 11:27:08", "updated_at" => "2025-06-12 11:27:08", "deleted_at" => NULL],
|
["id" => 103, "group_id" => 13, "title" => "附件 - 保留原文件名", "name" => "upload_attachment.filename_keep", "value" => NULL, "extra" => "0:否\n1:是", "type" => "radio", "sort" => 6, "remark" => "默认为否", "created_at" => "2025-06-12 11:27:08", "updated_at" => "2025-06-12 11:27:08", "deleted_at" => NULL],
|
||||||
["id" => 104, "group_id" => 13, "title" => "附件 - 唯一性保持", "name" => "upload_attachment.filemd5_unique", "value" => "1", "extra" => "0:否\n1:是", "type" => "radio", "sort" => 7, "remark" => "如果保持附件文件唯一,重复附件上传时将立即返回已存在的地址;如果不保持,则同模块同一天上传的文件根据原文件名覆盖。", "created_at" => "2025-06-12 11:28:22", "updated_at" => "2025-06-12 11:28:22", "deleted_at" => NULL],
|
["id" => 104, "group_id" => 13, "title" => "附件 - 唯一性保持", "name" => "upload_attachment.filemd5_unique", "value" => "1", "extra" => "0:否\n1:是", "type" => "radio", "sort" => 7, "remark" => "如果保持附件文件唯一,重复附件上传时将立即返回已存在的地址;如果不保持,则同模块同一天上传的文件根据原文件名覆盖。", "created_at" => "2025-06-12 11:28:22", "updated_at" => "2025-06-12 11:28:22", "deleted_at" => NULL],
|
||||||
|
['id' => 105, 'group_id' => 13, 'title' => '视频 - 保存到', 'name' => 'upload_video.save_to', 'value' => 'qiniu_cloud', 'extra' => 'local:本地\nqiniu_cloud:七牛云', 'type' => 'radio', 'sort' => 6, 'remark' => '视频保存位置,默认为“本地” - [本地为本站点服务器;七牛去为七牛云对象存储,上传经这本站点服务器中转,上传耗时稍慢于“本地”]', 'created_at' => '2025-07-25 10:46:24', 'updated_at' => '2025-07-25 16:41:53', 'deleted_at' => NULL],
|
||||||
|
['id' => 106, 'group_id' => 13, 'title' => '附件 - 保存到', 'name' => 'upload_attachment.save_to', 'value' => 'local', 'extra' => 'local:本地\nqiniu_cloud:七牛云', 'type' => 'radio', 'sort' => 9, 'remark' => '附件保存位置,默认为“本地” - [本地为本站点服务器;七牛去为七牛云对象存储,上传经这本站点服务器中转,上传耗时稍慢于“本地”]', 'created_at' => '2025-07-25 10:51:34', 'updated_at' => '2025-07-25 16:41:53', 'deleted_at' => NULL],
|
||||||
|
['id' => 107, 'group_id' => 14, 'title' => '视频 - 保存到', 'name' => 'upload_video.save_to', 'value' => 'qiniu_cloud', 'extra' => 'local:本地\nqiniu_cloud:七牛云', 'type' => 'radio', 'sort' => 6, 'remark' => '视频保存位置,默认为“本地” - [本地为本站点服务器;七牛去为七牛云对象存储,上传经这本站点服务器中转,上传耗时稍慢于“本地”]', 'created_at' => '2025-07-25 10:46:24', 'updated_at' => '2025-07-25 16:41:53', 'deleted_at' => NULL],
|
||||||
|
['id' => 108, 'group_id' => 14, 'title' => '附件 - 保存到', 'name' => 'upload_attachment.save_to', 'value' => 'local', 'extra' => 'local:本地\nqiniu_cloud:七牛云', 'type' => 'radio', 'sort' => 9, 'remark' => '附件保存位置,默认为“本地” - [本地为本站点服务器;七牛去为七牛云对象存储,上传经这本站点服务器中转,上传耗时稍慢于“本地”]', 'created_at' => '2025-07-25 10:51:34', 'updated_at' => '2025-07-25 16:41:53', 'deleted_at' => NULL],
|
||||||
];
|
];
|
||||||
|
|
||||||
$table = $this->table('sys_config');
|
$table = $this->table('sys_config');
|
||||||
|
|||||||
295
extend/filesystem/adapter/QiniuAdapter.php
Normal file
295
extend/filesystem/adapter/QiniuAdapter.php
Normal file
@@ -0,0 +1,295 @@
|
|||||||
|
<?php
|
||||||
|
namespace filesystem\adapter;
|
||||||
|
|
||||||
|
use League\Flysystem\Config;
|
||||||
|
use League\Flysystem\FilesystemAdapter;
|
||||||
|
use League\Flysystem\FileAttributes;
|
||||||
|
use League\Flysystem\UnableToCopyFile;
|
||||||
|
use League\Flysystem\UnableToDeleteFile;
|
||||||
|
use League\Flysystem\UnableToMoveFile;
|
||||||
|
use League\Flysystem\UnableToReadFile;
|
||||||
|
use League\Flysystem\UnableToRetrieveMetadata;
|
||||||
|
use League\Flysystem\UnableToSetVisibility;
|
||||||
|
use League\Flysystem\UnableToWriteFile;
|
||||||
|
use Qiniu\Auth;
|
||||||
|
use Qiniu\Storage\UploadManager;
|
||||||
|
use Qiniu\Storage\BucketManager;
|
||||||
|
|
||||||
|
class QiniuAdapter implements FilesystemAdapter
|
||||||
|
{
|
||||||
|
protected ?Auth $authMgr;
|
||||||
|
protected ?UploadManager $uploadMgr;
|
||||||
|
protected ?BucketManager $bucketMgr;
|
||||||
|
|
||||||
|
public function __construct(protected string $access_key, protected string $secret_key, protected string $bucket, protected string $base_url, protected string $path)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getAuthMgr(): Auth
|
||||||
|
{
|
||||||
|
return $this->authMgr ?? new Auth($this->access_key, $this->secret_key);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getUploadMgr(): UploadManager
|
||||||
|
{
|
||||||
|
return $this->uploadMgr ?? new UploadManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getBucketMgr(): BucketManager
|
||||||
|
{
|
||||||
|
return $this->bucketMgr ?? new BucketManager($this->authMgr);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getPathPrefix(): string
|
||||||
|
{
|
||||||
|
$path = ltrim($this->path, '\\/');
|
||||||
|
if ($path !== '' && !str_ends_with($path, '/')) {
|
||||||
|
$path = $path . '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $path;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function applyPathPrefix(string $path): string
|
||||||
|
{
|
||||||
|
$path = ltrim($path, '\\/');
|
||||||
|
return $this->getPathPrefix() . $path;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function parseUrl($url): array
|
||||||
|
{
|
||||||
|
$result = [];
|
||||||
|
|
||||||
|
// Build arrays of values we need to decode before parsing
|
||||||
|
$entities = [
|
||||||
|
'%21',
|
||||||
|
'%2A',
|
||||||
|
'%27',
|
||||||
|
'%28',
|
||||||
|
'%29',
|
||||||
|
'%3B',
|
||||||
|
'%3A',
|
||||||
|
'%40',
|
||||||
|
'%26',
|
||||||
|
'%3D',
|
||||||
|
'%24',
|
||||||
|
'%2C',
|
||||||
|
'%2F',
|
||||||
|
'%3F',
|
||||||
|
'%23',
|
||||||
|
'%5B',
|
||||||
|
'%5D',
|
||||||
|
'%5C'
|
||||||
|
];
|
||||||
|
$replacements = ['!', '*', "'", '(', ')', ';', ':', '@', '&', '=', '$', ',', '/', '?', '#', '[', ']', '/'];
|
||||||
|
|
||||||
|
// Create encoded URL with special URL characters decoded so it can be parsed
|
||||||
|
// All other characters will be encoded
|
||||||
|
$encodedURL = str_replace($entities, $replacements, urlencode($url));
|
||||||
|
|
||||||
|
// Parse the encoded URL
|
||||||
|
$encodedParts = parse_url($encodedURL);
|
||||||
|
|
||||||
|
// Now, decode each value of the resulting array
|
||||||
|
if ($encodedParts) {
|
||||||
|
foreach ($encodedParts as $key => $value) {
|
||||||
|
$result[$key] = urldecode(str_replace($replacements, $entities, $value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function normalizeHost($domain): string
|
||||||
|
{
|
||||||
|
if (0 !== stripos($domain, 'https://') && 0 !== stripos($domain, 'http://')) {
|
||||||
|
$domain = "http://{$domain}";
|
||||||
|
}
|
||||||
|
|
||||||
|
return rtrim($domain, '/') . '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getUrl(string $path): string
|
||||||
|
{
|
||||||
|
$segments = $this->parseUrl($path);
|
||||||
|
$query = empty($segments['query']) ? '' : '?' . $segments['query'];
|
||||||
|
|
||||||
|
return $this->normalizeHost($this->base_url) . ltrim(implode('/', array_map('rawurlencode', explode('/', $segments['path']))), '/') . $query;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function privateDownloadUrl(string $path, int $expires = 3600): string
|
||||||
|
{
|
||||||
|
return $this->getAuthMgr()->privateDownloadUrl($this->getUrl($path), $expires);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getMetadata($path): FileAttributes|array
|
||||||
|
{
|
||||||
|
$result = $this->getBucketMgr()->stat($this->bucket, $path);
|
||||||
|
$result[0]['key'] = $path;
|
||||||
|
|
||||||
|
return $this->normalizeFileInfo($result[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function normalizeFileInfo(array $stats): FileAttributes
|
||||||
|
{
|
||||||
|
return new FileAttributes(
|
||||||
|
$stats['key'],
|
||||||
|
$stats['fsize'] ?? null,
|
||||||
|
null,
|
||||||
|
isset($stats['putTime']) ? floor($stats['putTime'] / 10000000) : null,
|
||||||
|
$stats['mimeType'] ?? null
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function fileExists(string $path): bool
|
||||||
|
{
|
||||||
|
[, $error] = $this->getBucketMgr()->stat($this->bucket, $this->applyPathPrefix($path));
|
||||||
|
return is_null($error);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function directoryExists(string $path): bool
|
||||||
|
{
|
||||||
|
return $this->fileExists($path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function write(string $path, string $contents, Config $config): void
|
||||||
|
{
|
||||||
|
$mime = $config->get('mime', 'application/octet-stream');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Error|null $error
|
||||||
|
*/
|
||||||
|
[, $error] = $this->getUploadMgr()->put(
|
||||||
|
$this->getAuthMgr()->uploadToken($this->bucket),
|
||||||
|
$this->applyPathPrefix($path),
|
||||||
|
$contents,
|
||||||
|
null,
|
||||||
|
$mime,
|
||||||
|
$path
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($error) {
|
||||||
|
throw UnableToWriteFile::atLocation($path, $error->message());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function writeStream(string $path, $resource, Config $config): void
|
||||||
|
{
|
||||||
|
$data = '';
|
||||||
|
|
||||||
|
while (!feof($resource)) {
|
||||||
|
$data .= fread($resource, 1024);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->write($path, $data, $config);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function read(string $path): string
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$result = file_get_contents($this->privateDownloadUrl($path));
|
||||||
|
} catch (\Exception $th) {
|
||||||
|
throw UnableToReadFile::fromLocation($path);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (false === $result) {
|
||||||
|
throw UnableToReadFile::fromLocation($path);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function readStream(string $path)
|
||||||
|
{
|
||||||
|
if (ini_get('allow_url_fopen')) {
|
||||||
|
if ($result = fopen($this->privateDownloadUrl($path), 'r')) {
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw UnableToReadFile::fromLocation($path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function delete(string $path): void
|
||||||
|
{
|
||||||
|
[, $error] = $this->getBucketMgr()->delete($this->bucket, $this->applyPathPrefix($path));
|
||||||
|
if (!is_null($error)) {
|
||||||
|
throw UnableToDeleteFile::atLocation($path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function deleteDirectory(string $path): void
|
||||||
|
{
|
||||||
|
$this->delete($path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function createDirectory(string $path, Config $config): void
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setVisibility(string $path, string $visibility): void
|
||||||
|
{
|
||||||
|
throw UnableToSetVisibility::atLocation($path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function visibility(string $path): FileAttributes
|
||||||
|
{
|
||||||
|
throw UnableToRetrieveMetadata::visibility($path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function mimeType(string $path): FileAttributes
|
||||||
|
{
|
||||||
|
$meta = $this->getMetadata($path);
|
||||||
|
|
||||||
|
if ($meta->mimeType() === null) {
|
||||||
|
throw UnableToRetrieveMetadata::mimeType($path);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $meta;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function lastModified(string $path): FileAttributes
|
||||||
|
{
|
||||||
|
$meta = $this->getMetadata($path);
|
||||||
|
|
||||||
|
if ($meta->lastModified() === null) {
|
||||||
|
throw UnableToRetrieveMetadata::lastModified($path);
|
||||||
|
}
|
||||||
|
return $meta;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function fileSize(string $path): FileAttributes
|
||||||
|
{
|
||||||
|
$meta = $this->getMetadata($path);
|
||||||
|
|
||||||
|
if ($meta->fileSize() === null) {
|
||||||
|
throw UnableToRetrieveMetadata::fileSize($path);
|
||||||
|
}
|
||||||
|
return $meta;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function listContents(string $path, bool $deep): iterable
|
||||||
|
{
|
||||||
|
$result = $this->getBucketMgr()->listFiles($this->bucket, $path);
|
||||||
|
|
||||||
|
foreach ($result[0]['items'] ?? [] as $files) {
|
||||||
|
yield $this->normalizeFileInfo($files);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function move(string $source, string $destination, Config $config): void
|
||||||
|
{
|
||||||
|
[, $error] = $this->getBucketMgr()->rename($this->bucket, $source, $destination);
|
||||||
|
if (!is_null($error)) {
|
||||||
|
throw UnableToMoveFile::fromLocationTo($source, $destination);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function copy(string $source, string $destination, Config $config): void
|
||||||
|
{
|
||||||
|
[, $error] = $this->getBucketMgr()->copy($this->bucket, $source, $this->bucket, $destination);
|
||||||
|
if (!is_null($error)) {
|
||||||
|
throw UnableToCopyFile::fromLocationTo($source, $destination);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
56
extend/filesystem/driver/Qiniu.php
Normal file
56
extend/filesystem/driver/Qiniu.php
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
<?php
|
||||||
|
namespace filesystem\driver;
|
||||||
|
|
||||||
|
use Closure;
|
||||||
|
use filesystem\adapter\QiniuAdapter;
|
||||||
|
use League\Flysystem\FilesystemAdapter;
|
||||||
|
|
||||||
|
class Qiniu extends \think\filesystem\Driver
|
||||||
|
{
|
||||||
|
protected function createAdapter(): FilesystemAdapter
|
||||||
|
{
|
||||||
|
return new QiniuAdapter(
|
||||||
|
$this->config['access_key'],
|
||||||
|
$this->config['secret_key'],
|
||||||
|
$this->config['bucket'],
|
||||||
|
$this->config['base_url'],
|
||||||
|
$this->config['path_prefix']
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存文件
|
||||||
|
* @param string $path 路径
|
||||||
|
* @param \think\File $file 文件
|
||||||
|
* @param null|string|\Closure $rule 文件名规则
|
||||||
|
* @param array $options 参数
|
||||||
|
* @return bool|string
|
||||||
|
*/
|
||||||
|
public function putFile(string $path, \think\File $file, $rule = null, array $options = [])
|
||||||
|
{
|
||||||
|
if (!empty($this->config['filename_generator']) && $this->config['filename_generator'] instanceof Closure) {
|
||||||
|
$rule = $this->config['filename_generator']($file, $rule);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->putFileAs($path, $file, $file->hashName($rule), $options);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function url(string $path): string
|
||||||
|
{
|
||||||
|
if (str_starts_with($path, 'http://') || str_starts_with($path, 'https://')) {
|
||||||
|
return $path;
|
||||||
|
}
|
||||||
|
if (!str_starts_with($path, $this->config['path_prefix'])) {
|
||||||
|
$path = $this->config['path_prefix'] . '/' . $path;
|
||||||
|
}
|
||||||
|
return $this->concatPathToUrl($this->config['base_url'], $path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function path(string $path): string
|
||||||
|
{
|
||||||
|
if (!str_starts_with($path, $this->config['path_prefix'])) {
|
||||||
|
$path = $this->config['path_prefix'] . '/' . $path;
|
||||||
|
}
|
||||||
|
return $path;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,157 +0,0 @@
|
|||||||
<?php
|
|
||||||
namespace uploader;
|
|
||||||
|
|
||||||
use Qiniu\Auth;
|
|
||||||
use Qiniu\Storage\UploadManager;
|
|
||||||
use Qiniu\Storage\BucketManager;
|
|
||||||
|
|
||||||
class QiniuUploader
|
|
||||||
{
|
|
||||||
private $bucket = 'orico-opd';
|
|
||||||
private $accessKey = 'dOsTum4a5qvhPTBbZRPX0pIOU7PZWRX7htKjztms';
|
|
||||||
private $secretKey = 'KFxsGbnErkALFfeGdMa8QWTdodJbamMX0iznLe-q';
|
|
||||||
|
|
||||||
private $rule = [
|
|
||||||
'fileSize' => 1024 * 1024 * 5, // 默认最大上传5M
|
|
||||||
'fileExt' => 'jpeg,jpg,png', // 默认上传文件后缀
|
|
||||||
'fileMime' => 'image/jpeg,image/png,image/gif' // 默认上传文件mime
|
|
||||||
];
|
|
||||||
|
|
||||||
private $dir = true;
|
|
||||||
private $originalName = false;
|
|
||||||
private $pathPrefix = '';
|
|
||||||
private $fileNamePrefix = 'orico';
|
|
||||||
|
|
||||||
static public $domain = 'http://opdfile.f2b211.com/';
|
|
||||||
|
|
||||||
public function __construct($conf = [])
|
|
||||||
{
|
|
||||||
if (!empty($conf['bucket'])) {
|
|
||||||
$this->bucket = $conf['bucket'];
|
|
||||||
}
|
|
||||||
if (!empty($conf['accessKey'])) {
|
|
||||||
$this->accessKey = $conf['accessKey'];
|
|
||||||
}
|
|
||||||
if (!empty($conf['secretKey'])) {
|
|
||||||
$this->secretKey = $conf['secretKey'];
|
|
||||||
}
|
|
||||||
if (!empty($conf['pathPrefix'])) {
|
|
||||||
$this->pathPrefix = trim($conf['pathPrefix'], '/');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 生成随机字符串
|
|
||||||
*/
|
|
||||||
private function random($length, $type = "string", $convert = "0")
|
|
||||||
{
|
|
||||||
$conf = [
|
|
||||||
'number' => '0123456789',
|
|
||||||
'string' => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
|
|
||||||
'all' => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789='
|
|
||||||
];
|
|
||||||
$string = $conf[$type];
|
|
||||||
if (!$string) {
|
|
||||||
$string = $conf['string'];
|
|
||||||
}
|
|
||||||
$strlen = strlen($string) - 1;
|
|
||||||
$char = '';
|
|
||||||
for ($i = 0; $i < $length; $i++) {
|
|
||||||
$char .= $string[mt_rand(0, $strlen)];
|
|
||||||
}
|
|
||||||
if ($convert > 0) {
|
|
||||||
$res = strtoupper($char);
|
|
||||||
} elseif ($convert == 0) {
|
|
||||||
$res = $char;
|
|
||||||
} elseif ($convert < 0) {
|
|
||||||
$res = strtolower($char);
|
|
||||||
}
|
|
||||||
return $res;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 组装文件名
|
|
||||||
*/
|
|
||||||
private function buildFileName()
|
|
||||||
{
|
|
||||||
return $this->fileNamePrefix . time() . substr(time(), -5) . substr(microtime(), 2, 3) . $this->random(8);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 上传验证规则
|
|
||||||
*/
|
|
||||||
public function validate($rule)
|
|
||||||
{
|
|
||||||
$this->rule = $rule;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 上传文件到七牛云
|
|
||||||
*/
|
|
||||||
public function uploadFile($name)
|
|
||||||
{
|
|
||||||
// 构建鉴权对象
|
|
||||||
$auth = new Auth($this->accessKey, $this->secretKey);
|
|
||||||
|
|
||||||
// 生成上传 Token
|
|
||||||
$token = $auth->uploadToken($this->bucket);
|
|
||||||
|
|
||||||
// 初始化 UploadManager 对象并进行文件的上传。
|
|
||||||
$uploadMgr = new UploadManager();
|
|
||||||
|
|
||||||
$file = request()->file($name);
|
|
||||||
|
|
||||||
$aspectRatio = [];
|
|
||||||
if (!empty($this->rule['aspectRatio'])) {
|
|
||||||
$aspectRatio = $this->rule['aspectRatio'];
|
|
||||||
unset($this->rule['aspectRatio']);
|
|
||||||
}
|
|
||||||
$validate = validate([$name => $this->rule]);
|
|
||||||
if (!$validate->check([$name => $file])) {
|
|
||||||
throw new \Exception($validate->getError());
|
|
||||||
}
|
|
||||||
|
|
||||||
$fileName = $file->getOriginalName(); // 文件原名
|
|
||||||
if (!$this->originalName) {
|
|
||||||
$fileName = $this->buildFileName() . '.' . $file->extension();
|
|
||||||
if (!$this->dir && !empty($this->pathPrefix)) {
|
|
||||||
$fileName = $this->pathPrefix . '/' . $fileName;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($this->dir) {
|
|
||||||
$fileName = date('Y') . '/' . date('m') . '/' . date('d') . '/' . $fileName;
|
|
||||||
if (!empty($this->pathPrefix)) {
|
|
||||||
$fileName = $this->pathPrefix . '/' . $fileName;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$filePath = $file->getPathname(); // 临时路径
|
|
||||||
if (!empty($aspectRatio)) { // 验证图片宽高
|
|
||||||
list($width, $height, $type, $attr) = getimagesize($file);
|
|
||||||
if ($width != $aspectRatio['width'] || $height != $aspectRatio['height']) {
|
|
||||||
throw new \Exception('图片宽高不符合');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$fileType = $file->getOriginalMime();
|
|
||||||
list($ret, $err) = $uploadMgr->putFile($token, $fileName, $filePath, null, $fileType, false);
|
|
||||||
|
|
||||||
if ($err !== null) {
|
|
||||||
throw new \Exception($err);
|
|
||||||
} else {
|
|
||||||
return ['hash' => $ret['hash'], 'filename' => $ret['key'], 'remote_url' => self::$domain . $ret['key']];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 上传文件到七牛云
|
|
||||||
*/
|
|
||||||
public function deleteFile($name)
|
|
||||||
{
|
|
||||||
// 构建鉴权对象
|
|
||||||
$auth = new Auth($this->accessKey, $this->secretKey);
|
|
||||||
// 初始化 BucketManager 对象并进行文件的删除。
|
|
||||||
$bucketManager = new BucketManager($auth);
|
|
||||||
$ret = $bucketManager->delete($this->bucket, $name);
|
|
||||||
return $ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user