refactor: 七牛云上传
This commit is contained in:
@@ -9,6 +9,7 @@ use app\admin\model\v1\SysAttachmentUploadRecordModel;
|
||||
use Intervention\Image\ImageManager;
|
||||
use Intervention\Image\Typography\FontFactory;
|
||||
use think\facade\Filesystem;
|
||||
use filesystem\Qiniu;
|
||||
|
||||
/**
|
||||
* 文件上传控制器
|
||||
@@ -153,8 +154,8 @@ class Upload
|
||||
$image_model = new SysImageUploadRecordModel();
|
||||
$image_model->language_id = request()->lang_id;
|
||||
$image_model->module = $param['module'];
|
||||
$image_model->image_path = $filename;
|
||||
$image_model->image_thumb = $thumb_filename;
|
||||
$image_model->image_path = $storage . '/' . $filename;
|
||||
$image_model->image_thumb = $storage . '/' . $thumb_filename;
|
||||
$image_model->file_size = $file_size;
|
||||
$image_model->file_type = $mime_type;
|
||||
$image_model->file_md5 = $filemd5;
|
||||
@@ -165,8 +166,8 @@ class Upload
|
||||
}
|
||||
|
||||
return success('操作成功', [
|
||||
'path' => $storage . '/' . $image_model->image_path,
|
||||
'thumb_path' => $storage . '/' . $image_model->image_thumb,
|
||||
'path' => $image_model->image_path,
|
||||
'thumb_path' => $image_model->image_thumb,
|
||||
'filemd5' => $image_model->file_md5,
|
||||
'filesha1' => $image_model->file_sha1
|
||||
]);
|
||||
@@ -226,6 +227,7 @@ class Upload
|
||||
'filename_keep' => (int)data_get($options, 'filename_keep.value', 0) == 1,
|
||||
'filemd5_unique' => (int)data_get($options, 'filemd5_unique.value', 0) == 1,
|
||||
'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(
|
||||
'filename_keep' => $filename_keep,
|
||||
'filemd5_unique' => $filemd5_unique
|
||||
'filemd5_unique' => $filemd5_unique,
|
||||
'save_to' => $save_to,
|
||||
) = $this->getUploadOptions('upload_video');
|
||||
// 是否需要根据文件MD5值检查文件是否已存在
|
||||
$video = $filemd5_unique ? SysVideoUploadRecordModel::md5($filemd5)->find() : null;
|
||||
if (is_null($video)) {
|
||||
// 保存位置配置 key
|
||||
$disk = 'video';
|
||||
// 检查是否需要保留原文件名
|
||||
$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->language_id = request()->lang_id;
|
||||
$video->module = $param['module'];
|
||||
$video->video_path = $filename;
|
||||
$video->video_path = $video_path;
|
||||
$video->file_size = $file->getSize();
|
||||
$video->file_type = $file->getOriginalMime();
|
||||
$video->file_md5 = $filemd5;
|
||||
@@ -369,7 +386,7 @@ class Upload
|
||||
}
|
||||
|
||||
return success('上传成功', [
|
||||
'path' => $storage . '/' . $video->video_path,
|
||||
'path' => $video->video_path,
|
||||
'file_md5' => $video->file_md5,
|
||||
'file_sha1' => $video->file_sha1
|
||||
]);
|
||||
@@ -399,25 +416,42 @@ class Upload
|
||||
return error($validate->getError());
|
||||
}
|
||||
|
||||
$storage = config('filesystem.disks.public.url');
|
||||
|
||||
$filemd5 = $file->md5();
|
||||
$filesha1 = $file->sha1();
|
||||
|
||||
// 获取附件上传配置
|
||||
list(
|
||||
'filename_keep' => $filename_keep,
|
||||
'filemd5_unique' => $filemd5_unique
|
||||
'filemd5_unique' => $filemd5_unique,
|
||||
'save_to' => $save_to
|
||||
) = $this->getUploadOptions('upload_attachment');
|
||||
// 是否需要根据文件MD5值检查文件是否已存在
|
||||
$attachment = $filemd5_unique ? SysAttachmentUploadRecordModel::md5($filemd5)->find() : null;
|
||||
if (is_null($attachment)) {
|
||||
// 保存位置配置 key
|
||||
$disk = 'public';
|
||||
// 检查是否需要保留原文件名
|
||||
$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->language_id = request()->lang_id;
|
||||
$attachment->attachment_path = $filename;
|
||||
$attachment->attachment_path = $attachment_path;
|
||||
$attachment->file_size = $file->getSize();
|
||||
$attachment->file_type = $file->getOriginalMime();
|
||||
$attachment->file_md5 = $filemd5;
|
||||
@@ -427,9 +461,8 @@ class Upload
|
||||
}
|
||||
}
|
||||
|
||||
$storage = config('filesystem.disks.public.url');
|
||||
return success('上传成功', [
|
||||
'path' => $storage . '/' . $attachment->attachment_path,
|
||||
'path' => $attachment->attachment_path,
|
||||
'file_md5' => $attachment->file_md5,
|
||||
'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');
|
||||
}
|
||||
}
|
||||
|
||||
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,
|
||||
]);
|
||||
|
||||
|
||||
|
||||
// 获取附件分类
|
||||
$categorys = AttachmentCategoryModel::field([
|
||||
'id',
|
||||
@@ -61,6 +59,16 @@ class Attachment extends Common
|
||||
'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('page', $attachements->render());
|
||||
|
||||
@@ -124,6 +132,9 @@ class Attachment extends Common
|
||||
]);
|
||||
|
||||
if (!$videos->isEmpty()) {
|
||||
$videos->each(function($item) {
|
||||
$item->video = url_filesystem_detect($item->video);
|
||||
});
|
||||
$videos->setCollection($videos->getCollection()->chunk(2));
|
||||
}
|
||||
View::assign('videos', $videos);
|
||||
|
||||
Reference in New Issue
Block a user