使用Tenancy for Laravel(v3)和Filament(v3)多租户文件上传报错求助
解决方案:Tenancy for Laravel v3 + Filament v3 多租户文件上传路径错误问题
核心问题是Livewire临时上传未使用租户专属存储磁盘,导致文件存入中央存储路径,无法获取元数据。以下是针对性解决步骤:
配置Livewire临时上传使用租户磁盘
编辑config/livewire.php,修改或添加temporary_file_upload配置:'temporary_file_upload' => [ 'disk' => 'tenant', // 替换为你的租户磁盘名称 'rules' => 'file|max:10240', // 按需调整文件大小限制 'directory' => 'livewire-tmp', 'middleware' => ['tenant'], // 确保请求经过租户识别中间件 ],确认租户磁盘配置正确性
检查config/filesystems.php中的租户磁盘配置,确保路径动态关联租户ID:'disks' => [ // ...其他磁盘配置 'tenant' => [ 'driver' => 'local', 'root' => storage_path('app/tenants/' . tenant('id')), // 动态生成租户专属路径 'visibility' => 'private', ], ],确保Livewire路由经过Tenancy中间件
确保Tenancy的租户识别中间件(如InitializeTenancyByDomain)已应用到Web路由组,在app/Http/Kernel.php的web中间件组中添加:protected $middlewareGroups = [ 'web' => [ // ...其他中间件 \Stancl\Tenancy\Middleware\InitializeTenancyByDomain::class, \Stancl\Tenancy\Middleware\PreventAccessFromCentralDomains::class, ], ];若手动注册Livewire路由,需放在Tenancy中间件组内:
Route::middleware(['tenant'])->group(function () { Livewire::routes(); });设置Filament默认存储磁盘
在Filament面板配置文件(如app/Providers/Filament/AdminPanelProvider.php)中指定默认使用租户磁盘:public function panel(Panel $panel): Panel { return $panel // ...其他面板配置 ->defaultStorageDisk('tenant'); }清理缓存并验证存储路径
执行以下命令清除配置缓存:php artisan cache:clear php artisan config:clear测试上传后,检查临时文件是否存入租户专属路径(如
storage/app/tenants/[租户ID]/livewire-tmp),而非中央存储的storage/app/private/livewire-tmp。自定义Livewire临时上传类(可选)
若上述配置仍不生效,可自定义临时上传类强制使用租户磁盘:// app/Livewire/CustomTemporaryFileUpload.php namespace App\Livewire; use Livewire\Features\SupportFileUploads\TemporaryFileUpload; class CustomTemporaryFileUpload extends TemporaryFileUpload { protected function disk() { return \Storage::disk('tenant'); } }然后在
config/livewire.php中指定该类:'features' => [ \Livewire\Features\SupportFileUploads\FileUploads::class => [ 'temporary_file_upload_class' => \App\Livewire\CustomTemporaryFileUpload::class, ], ],
内容的提问来源于stack exchange,提问作者Mahdi Sahib
相关产品推荐
相关产品推荐

