开始实现使用内部的上传逻辑;

This commit is contained in:
2022-07-11 17:41:20 +08:00
parent 5081cd8790
commit 3078dfad39
12 changed files with 396 additions and 777 deletions

View File

@@ -6,9 +6,11 @@ namespace app\admin\controller;
use app\admin\model\SystemUploadfile;
use app\common\controller\AdminController;
use app\common\service\MenuService;
use app\common\service\UploadService;
use EasyAdmin\upload\Uploadfile;
use think\db\Query;
use think\facade\Cache;
use think\facade\Filesystem;
class Ajax extends AdminController
{
@@ -59,27 +61,20 @@ class Ajax extends AdminController
'upload_type' => $this->request->post('upload_type'),
'file' => $this->request->file('file'),
];
$uploadConfig = sysconfig('upload');
empty($data['upload_type']) && $data['upload_type'] = $uploadConfig['upload_type'];
$rule = [
'upload_type|指定上传类型有误' => "in:{$uploadConfig['upload_allow_type']}",
'file|文件' => "require|file|fileExt:{$uploadConfig['upload_allow_ext']}|fileSize:{$uploadConfig['upload_allow_size']}",
];
$this->validate($data, $rule);
try {
$upload = Uploadfile::instance()
->setUploadType($data['upload_type'])
->setUploadConfig($uploadConfig)
->setFile($data['file'])
->save();
$upload_service = new UploadService($data['upload_type']);
$upload_service->validateException($data['file']);
$result = $upload_service->save($data['file']);
} catch (\Exception $e) {
$this->error($e->getMessage());
}
if ($upload['save'] == true) {
$this->success($upload['msg'], ['url' => $upload['url']]);
} else {
$this->error($upload['msg']);
}
$this->success('上传成功', $result);
}
/**
@@ -158,5 +153,4 @@ class Ajax extends AdminController
];
return json($data);
}
}
}

View File

@@ -17,8 +17,8 @@ $ul_system_config = array(
array(
"name" => "upload_type",
"group" => "upload",
"value" => "local",
"remark" => "当前上传方式 local,alioss,qnoss,txoss",
"value" => "local_public",
"remark" => "当前上传方式 local_public,alioss,qnoss,txoss",
"sort" => 0,
),
array(
@@ -45,7 +45,7 @@ $ul_system_config = array(
array(
"name" => "upload_allow_type",
"group" => "upload",
"value" => "local,alioss,qnoss,txcos",
"value" => "local_public,alioss,qnoss,txcos",
"remark" => "可用的上传文件方式",
"sort" => 0,
),

View File

@@ -3,7 +3,7 @@
<div class="layui-form-item">
<label class="layui-form-label required">存储方式</label>
<div class="layui-input-block">
{foreach ['local'=>'本地存储','alioss'=>'阿里云oss','qnoss'=>'七牛云oss','txcos'=>'腾讯云cos'] as $key=>$val}
{foreach ['local_public'=>'本地存储','alioss'=>'阿里云oss','qnoss'=>'七牛云oss','txcos'=>'腾讯云cos'] as $key=>$val}
<input type="radio" v-model="upload_type" name="upload_type" lay-filter="upload_type" value="{$key}" title="{$val}" {if $key==sysconfig('upload','upload_type')}checked=""{/if}>
{/foreach}
</div>
@@ -53,7 +53,7 @@
<label class="layui-form-label required">空间名称</label>
<div class="layui-input-block">
<input type="text" name="alioss_bucket" class="layui-input" lay-verify="required" lay-reqtext="请输入空间名称" placeholder="请输入空间名称" value="{:sysconfig('upload','alioss_bucket')}">
<tip>例子:easy-admin</tip>
<tip>例子:ulthon-admin</tip>
</div>
</div>
@@ -61,7 +61,7 @@
<label class="layui-form-label required">访问域名</label>
<div class="layui-input-block">
<input type="text" name="alioss_domain" class="layui-input" lay-verify="required" lay-reqtext="请输入访问域名" placeholder="请输入访问域名" value="{:sysconfig('upload','alioss_domain')}">
<tip>例子:easy-admin.oss-cn-shenzhen.aliyuncs.com</tip>
<tip>例子:ulthon-admin.oss-cn-shenzhen.aliyuncs.com</tip>
</div>
</div>
@@ -93,7 +93,7 @@
<label class="layui-form-label required">存储桶名称</label>
<div class="layui-input-block">
<input type="text" name="tecos_bucket" class="layui-input" lay-verify="required" lay-reqtext="请输入存储桶名称" placeholder="请输入存储桶名称" value="{:sysconfig('upload','tecos_bucket')}">
<tip>例子:easyadmin-1251997243</tip>
<tip>例子:ulthon-admin-1251997243</tip>
</div>
</div>
@@ -117,7 +117,7 @@
<label class="layui-form-label required">存储空间</label>
<div class="layui-input-block">
<input type="text" name="qnoss_bucket" class="layui-input" lay-verify="required" lay-reqtext="请输入存储桶地域" placeholder="请输入存储桶地域" value="{:sysconfig('upload','qnoss_bucket')}">
<tip>例子:easyadmin</tip>
<tip>例子:ulthon-admin</tip>
</div>
</div>

View File

@@ -7,7 +7,6 @@
<input name="head_img" class="layui-input layui-col-xs6" lay-verify="required" lay-reqtext="请上传文件" placeholder="请上传文件" value="">
<div class="layuimini-upload-btn">
<span><a class="layui-btn" data-upload="head_img" data-upload-number="*" data-upload-exts="*"><i class="fa fa-upload"></i> 上传文件</a></span>
<span><a class="layui-btn layui-btn-normal"><i class="fa fa-list"></i> 选择文件</a></span>
</div>
</div>
</div>

View File

@@ -3,6 +3,7 @@
use app\common\service\AuthService;
use think\facade\Cache;
use think\facade\Request;
use think\route\Url;
if (!function_exists('__url')) {
@@ -219,3 +220,28 @@ if (!function_exists('unparse_url')) {
return "$scheme$user$pass$host$port$path$query$fragment";
}
}
function build_upload_url($url)
{
$config = sysconfig('upload');
$upload_type = $config['upload_type'] ?? 'local_public';
$prefix_url = '';
switch ($upload_type) {
case 'local_public':
$prefix_url = Request::domain();
break;
case 'qnoss':
$prefix_url = $config['qnoss_domain'];
break;
default:
# code...
break;
}
return trim($prefix_url, '/') . '/' . trim($url, '/');
}

View File

@@ -0,0 +1,66 @@
<?php
namespace app\common\service;
use think\facade\Filesystem;
use think\facade\Validate;
use think\File;
class UploadService
{
protected $uploadType = 'local_public';
public function __construct($upload_type = 'local_public')
{
$uploadConfig = sysconfig('upload');
empty($upload_type) && $upload_type = $uploadConfig['upload_type'];
$this->uploadType = $upload_type;
}
public function validate($file, $allow_ext = null, $allow_size = null, $fail_exception = false)
{
$uploadConfig = sysconfig('upload');
if (!is_null($allow_ext)) {
$uploadConfig['upload_allow_ext'] = $allow_ext;
}
if (!is_null($allow_size)) {
$uploadConfig['upload_allow_size'] = $allow_size;
}
$rule = [
'upload_type|指定上传类型有误' => "in:{$uploadConfig['upload_allow_type']}",
'file|文件' => "require|file|fileExt:{$uploadConfig['upload_allow_ext']}|fileSize:{$uploadConfig['upload_allow_size']}",
];
return Validate::failException($fail_exception)->check([
'upload_type' => $this->uploadType,
'file' => $file
], $rule);
}
public function validateException($file, $allow_ext = null, $allow_size = null)
{
return $this->validate($file, $allow_ext, $allow_size, true);
}
public function save(File $file)
{
$save_name = Filesystem::disk($this->uploadType)->putFile('upload', $file, function () {
return date('Ymd') . DIRECTORY_SEPARATOR . uniqid();
});
$url = build_upload_url($save_name);
return [
'url' => $url,
'save_name' => $save_name
];
}
}