Laravel Filament:如何让上传图片仅在后台面板可见
解决方案:Filament后台私有图片配置(仅后台可见)
要实现上传的图片仅Filament后台可查看,外部无法直接访问,核心思路是将图片存储到非公开磁盘,同时通过带权限验证的路由让Filament后台能访问这些图片。具体步骤如下:
1. 配置非公开存储磁盘
在config/filesystems.php中添加一个自定义私有磁盘,存储路径指向storage/app下的非公开目录(默认不会被web服务器直接访问):
// config/filesystems.php return [ // ... 其他配置 'disks' => [ // ... 已有的磁盘(public、local等) 'filament_private' => [ 'driver' => 'local', 'root' => storage_path('app/filament-private'), 'throw' => false, ], ], ];
2. 创建带权限验证的图片访问路由
添加一个专门的路由,用于Filament后台用户访问私有图片,未登录后台的用户会被拒绝:
// routes/web.php use Illuminate\Support\Facades\Storage; use Filament\Facades\Filament; Route::get('/filament-private-images/{path}', function ($path) { // 验证用户是否已通过Filament后台认证 if (!Filament::auth()->check()) { abort(403, '无权访问'); } // 获取文件内容和MIME类型 $file = Storage::disk('filament_private')->get($path); $mimeType = Storage::disk('filament_private')->mimeType($path); return response($file, 200)->header('Content-Type', $mimeType); })->where('path', '.*')->name('filament.private.image');
3. 外部上传表单指定私有磁盘
在你后台外的上传表单对应的控制器中,将文件存储到刚才配置的filament_private磁盘:
// 示例上传控制器方法 public function store(Request $request) { $request->validate([ 'image' => 'required|image|max:2048', // 根据需求调整验证规则 ]); // 将文件存储到私有磁盘,返回相对路径 $imagePath = $request->file('image')->store('uploads', 'filament_private'); // 将路径保存到数据库(关联到你的模型) // YourModel::create(['image_path' => $imagePath]); return redirect()->back()->with('success', '图片上传成功'); }
4. Filament后台配置图片显示
在Filament的资源表格/表单中,通过自定义URL指向我们创建的权限路由,实现后台可见:
// 示例:Filament资源的表格列配置 use Filament\Tables\Columns\ImageColumn; public static function table(Table $table): Table { return $table ->columns([ // ... 其他列 ImageColumn::make('image_path') ->label('私有图片') ->url(function ($record) { // 生成带权限验证的图片URL return route('filament.private.image', $record->image_path); }) ->width(100) ->height(100), ]); }
原理说明
public磁盘的文件会通过storage:link命令创建软链到public/storage,因此可以直接通过公开URL访问,无权限限制;local或自定义私有磁盘的文件默认仅能通过PHP读取,我们通过路由添加Filament登录验证,确保只有后台用户能获取图片资源,外部访问会返回403;
内容的提问来源于stack exchange,提问作者mart
相关产品推荐
相关产品推荐

