如何在FilamentPHP管理面板中展示私有上传文件?
在FilamentPHP管理面板中展示私有上传文件的可行方案
要在FilamentPHP中展示存放在Laravel非公共存储目录的私有文件,且仅允许认证用户访问,可按以下步骤实现:
1. 配置私有存储磁盘
首先在config/filesystems.php中定义非公共存储磁盘,指向storage/app/private目录(可自定义路径):
'disks' => [ // 其他磁盘配置... 'private' => [ 'driver' => 'local', 'root' => storage_path('app/private'), 'url' => env('APP_URL').'/storage/private', 'visibility' => 'private', ], ],
2. 创建带权限验证的文件访问路由
在routes/web.php中添加路由,通过auth中间件限制仅认证用户访问,同时处理文件响应:
use Illuminate\Support\Facades\Storage; use Illuminate\Http\Request; Route::get('/storage/private/{path}', function (Request $request, $path) { if (!Storage::disk('private')->exists($path)) { abort(404, '文件不存在'); } $fileContent = Storage::disk('private')->get($path); $mimeType = Storage::disk('private')->mimeType($path); return response($fileContent, 200) ->header('Content-Type', $mimeType); })->middleware('auth')->where('path', '.*');
3. 在Filament资源中展示文件链接
在表格中展示
在对应Resource的table方法里,用LinkColumn生成文件访问链接,仅对认证用户可见:
use Filament\Tables\Columns\LinkColumn; public static function table(Table $table): Table { return $table ->columns([ // 其他字段... LinkColumn::make('file_path') ->label('私有文件') ->url(fn ($record) => url("/storage/private/{$record->file_path}")) ->openUrlInNewTab() ->visible(fn () => auth()->check()), ]); }
在表单/详情页展示
在Resource的form方法里,用Link组件展示文件链接:
use Filament\Forms\Components\Link; public static function form(Form $form): Form { return $form ->schema([ // 其他字段... Link::make('文件链接') ->url(fn ($record) => url("/storage/private/{$record->file_path}")) ->openUrlInNewTab() ->visible(fn () => auth()->check()), ]); }
4. 配置私有文件上传(可选)
如果需要在Filament中上传私有文件,用FileUpload组件指定磁盘为private:
use Filament\Forms\Components\FileUpload; FileUpload::make('file_path') ->disk('private') ->directory('user-uploads') ->visibility('private') ->required(),
额外权限控制(可选)
若需更细粒度的权限(比如仅文件所有者可访问),可在路由中添加验证逻辑:
Route::get('/storage/private/{path}', function (Request $request, $path) { // 假设文件记录关联到用户,通过File模型查询 $fileRecord = \App\Models\File::where('path', $path)->firstOrFail(); if ($request->user()->id !== $fileRecord->user_id && !$request->user()->hasRole('admin')) { abort(403, '无权限访问该文件'); } // 后续文件响应逻辑... })->middleware('auth')->where('path', '.*');
内容的提问来源于stack exchange,提问作者Marcellin Khoury
相关产品推荐
相关产品推荐

