问题描述
需要解决dcat admin 表单多附件管理的(附件名和保存文件名分开保存)
解决方案
上传文件管理
-
首先是新建上传文件表
Schema::create('uploads', function (Blueprint $table) { $table->string('disk', 30)->comment('存储位置'); $table->string('type', 20)->default('file')->comment('文件类型'); $table->string('name', 150)->nullable()->comment('文件名称'); $table->string('path', 150)->comment('文件路径'); });
-
新建上传文件用的路由
$router->any('/upload/handle/{disk}/{dir}', 'UploadController@handle');
-
上传处理
public function handle($diskName, $dir) { $disk =$this->disk($diskName); // 判断是否是删除文件请求 if ($this->isDeleteRequest()) { Upload::where('path', request()->key)->delete(); // 删除文件并响应 return $this->deleteFileAndResponse($disk); } // 获取上传的文件 $file = $this->file(); $newName = Common::uniqueID().'.'.$file->getClientOriginalExtension(); $result = $disk->putFileAs($dir, $file, $newName); $path = "{$dir}/$newName"; $upload = new Upload; $upload->name = request()->name; $upload->path = $path; $upload->disk = $diskName; $upload->save(); return $result ? $this->responseUploaded($path, $disk->url($path)) : $this->responseErrorMessage('文件上传失败'); }
-
扩展字段
class CustomMultiFile extends MultipleFile { protected function initialPreviewConfig() { $previews = []; foreach ($this->value() as $path => $name) { $previews[] = [ 'id' => $path, 'path' => Helper::basename($name), 'url' => $this->objectUrl($path), ]; } return $previews; } }
-
注册扩展字段
Form::extend('customMultiFile', CustomMultiFile::class);
-
表单字段
$form->customMultiFile('attachment', '附件')->disk('public') ->url('upload/handle/public/attachment') ->autoUpload()->autoSave(false) ->removable(true)->limit(10);