diff --git a/app/Admin/Components.php b/app/Admin/Components.php index de807e0..7c2f50b 100644 --- a/app/Admin/Components.php +++ b/app/Admin/Components.php @@ -70,6 +70,7 @@ class Components extends BaseRenderer { */ public function imageControl($name, $label){ return amis()->ImageControl($name, $label) + ->joinValues(false) ->autoUpload(true)->maxSize('5*1024*1024');//不能大于5M } @@ -77,12 +78,25 @@ class Components extends BaseRenderer { * 图片上传,带裁剪 */ public function cropImageControl($name, $label, $aspectRatio = null){ - return amis()->ImageControl($name, $label) + return amis()->ImageControl($name, $label)->joinValues(false) ->crop([ 'aspectRatio' => $aspectRatio ?? 1 ])->autoUpload(true); } + /** + * 普通文件上传 + */ + public function fileControl($name, $label, $accept = '.txt', $multiple = false){ + return amis()->FileControl($name, $label ?? __('admin.components.files')) + ->multiple($multiple) + // ->receiver() + ->joinValues(false) + ->useChunk(false) + ->maxSize(20*1024*1024) + ->accept($accept); + } + /** * 标签选择 */ diff --git a/app/Admin/Controllers/ArticleController.php b/app/Admin/Controllers/ArticleController.php index 907e903..85b245c 100644 --- a/app/Admin/Controllers/ArticleController.php +++ b/app/Admin/Controllers/ArticleController.php @@ -65,6 +65,7 @@ class ArticleController extends AdminController amis()->DateTimeControl('published_at', __('admin.articles.published_at'))->format('YYYY-MM-DD HH:mm:ss')->description(__('admin.articles.published_at_remark')), amis()->SwitchControl('is_enable', __('admin.articles.is_enable'))->value(false), amis()->SwitchControl('is_recommend', __('admin.articles.is_recommend'))->value(false), + Components::make()->fileControl('appendixes', __('admin.articles.appendixes'), '.xsl,.xlsx,.txt,.doc,.docx,.pdf,.pptx'), ])->md(4), amis()->Wrapper()->body([ Components::make()->fuEditorControl('content', __('admin.articles.content')), diff --git a/app/Admin/Controllers/IndexController.php b/app/Admin/Controllers/IndexController.php new file mode 100644 index 0000000..044fcf1 --- /dev/null +++ b/app/Admin/Controllers/IndexController.php @@ -0,0 +1,12 @@ +resource('system/keywords', \App\Admin\Controllers\KeywordController::class); $router->resource('articles', \App\Admin\Controllers\ArticleController::class); + + //修改上传 + $router->post('upload_file', [\App\Admin\Controllers\IndexController::class, 'uploadFile']); + $router->post('upload_image', [\App\Admin\Controllers\IndexController::class, 'uploadImage']); + $router->post('upload_rich', [\App\Admin\Controllers\IndexController::class, 'uploadRich']); }); diff --git a/app/Casts/Storage.php b/app/Casts/Storage.php index c8b7c83..404f9b5 100644 --- a/app/Casts/Storage.php +++ b/app/Casts/Storage.php @@ -26,7 +26,7 @@ class Storage implements CastsAttributes */ public function get($model, $key, $value, $attributes) { - return $value ? (Str::startsWith($value, ['http://', 'https://']) ? $value : StorageFacades::disk(Admin::config('admin.upload.disk'))->url($value)) : ''; + return $value ? (Str::startsWith($value, ['http://', 'https://']) ? $value : StorageFacades::disk(Admin::config('admin.upload.disk'))->url($value)).'?time='.time() : ''; } /** diff --git a/app/Models/Article.php b/app/Models/Article.php index 5fdae7c..66576b2 100644 --- a/app/Models/Article.php +++ b/app/Models/Article.php @@ -27,6 +27,7 @@ class Article extends Model 'is_enable' => 'boolean', 'is_recommend' => 'boolean', 'cover' => Storage::class, + 'appendixes' => 'array', ]; protected $fillable = [ diff --git a/app/Services/Admin/ArticleService.php b/app/Services/Admin/ArticleService.php index 9d161a9..01e2190 100644 --- a/app/Services/Admin/ArticleService.php +++ b/app/Services/Admin/ArticleService.php @@ -4,6 +4,7 @@ namespace App\Services\Admin; use App\Models\Article; use App\Models\Filters\ArticleFilter; +use App\Traits\UploadTrait; use Illuminate\Support\Arr; /** @@ -12,6 +13,8 @@ use Illuminate\Support\Arr; */ class ArticleService extends BaseService { + use UploadTrait; + protected string $modelName = Article::class; protected string $modelFilterName = ArticleFilter::class; @@ -27,6 +30,9 @@ class ArticleService extends BaseService $data['published_at'] = now(); } + $data['cover'] = $this->saveImage('cover', 'articles/cover')[0]; + $data['appendixes'] = $this->saveFile('appendixes', 'articles/appendixes'); + foreach ($data as $k => $v) { if (!in_array($k, $columns)) { continue; @@ -49,6 +55,9 @@ class ArticleService extends BaseService if ($isEnable && empty($publishedAt) && empty($model->published_at)) { $data['published_at'] = now(); } + + $data['cover'] = $this->saveImage('cover', 'articles/cover')[0]; + $data['appendixes'] = $this->saveFile('appendixes', 'articles/appendixes'); foreach ($data as $k => $v) { if (!in_array($k, $columns)) { diff --git a/app/Traits/UploadTrait.php b/app/Traits/UploadTrait.php new file mode 100644 index 0000000..a39ee02 --- /dev/null +++ b/app/Traits/UploadTrait.php @@ -0,0 +1,105 @@ +upload('image'); + } + + public function uploadFile() + { + return $this->upload(); + } + + /** + * 富文本内文件上传 + */ + public function uploadRich() + { + $fromWangEditor = false; + $file = request()->file('file'); + + if (!$file) { + $fromWangEditor = true; + $file = request()->file('wangeditor-uploaded-image'); + if (!$file) { + $file = request()->file('wangeditor-uploaded-video'); + } + } + + if (!$file) { + return $this->response()->additional(['errno' => 1])->fail(__('admin.upload_file_error')); + } + + $path = $file->store(Admin::config('admin.upload.directory.rich'), Admin::config('admin.upload.disk')); + + $link = Storage::disk(Admin::config('admin.upload.disk'))->url($path); + + if ($fromWangEditor) { + return $this->response()->additional(['errno' => 0])->success(['url' => $link]); + } + + return $this->response()->additional(compact('link'))->success(compact('link')); + } + + /** + * 存放临时文件目录; + */ + protected function upload($type = 'file') + { + $file = request()->file('file'); + + if (!$file) { + return $this->response()->fail(__('admin.upload_file_error')); + } + + $path = $file->store(Admin::config('admin.upload.tem_directory.' . $type), Admin::config('admin.upload.disk')); + + return $this->response()->success(['value' => $path]); + } + + public function saveImage($field = 'image', $path) + { + return $this->saveFile($field, $path); + } + + /** + * 表单提交时,转存实际目录,并保留上传时文件名称; + */ + public function saveFile($field = 'file', $path) + { + $file = request()->file($field); + + if (!$file) { + $file = request()->get($field); + } + + $fileArr = []; + //判断是否多个文件; + if(isset($file['name'])){ + $files = [$file]; + }else{ + $files =$file; + } + + foreach($files as $file){ + if(is_array($file)){ + if(isset($file['name'])){ + $filePath = $path.'/'.$file['name']; + Storage::disk(Admin::config('admin.upload.disk'))->move($file['value'], $filePath); + $fileArr[] = $filePath; + } + }else{ + $fileArr[] = $file; + } + } + + return $fileArr; + } +} \ No newline at end of file diff --git a/config/admin.php b/config/admin.php index d9d063a..54b0f3e 100644 --- a/config/admin.php +++ b/config/admin.php @@ -61,6 +61,12 @@ return [ 'file' => 'files', 'rich' => 'rich', ], + // 临时目录 + 'tem_directory' => [ + 'image' => 'temporary/images', + 'file' => 'temporary/file', + 'rich' => 'temporary/rich', + ] ], 'https' => env('ADMIN_HTTPS', false), diff --git a/lang/zh_CN/admin.php b/lang/zh_CN/admin.php index 7805ccc..facb7c5 100644 --- a/lang/zh_CN/admin.php +++ b/lang/zh_CN/admin.php @@ -72,7 +72,8 @@ return [ 'enabled' => '已启用', 'disabled' => '已禁用', ], - 'tag' => '标签' + 'tag' => '标签', + 'files' => '文件' ], 'code_generators' => [