Laravel从数据库设置自定义FTP磁盘凭证后登录失败问题
问题原因
- Laravel 文件系统的磁盘实例在第一次调用
Storage::disk('custom-ftp')后会被缓存到容器中,后续即使修改 Config 配置,重复调用同名称磁盘也会复用之前的旧实例,不会读取新配置。 - 你现有代码里的配置键名写错了:正确的配置前缀是
filesystems.disks.custom-ftp(disk 是复数形式 disks),错误的键名会导致配置修改根本不生效。
解决方案
方案1:动态创建磁盘实例(更适合多用户不同FTP的场景)
不需要提前在 filesystems.php 中预定义磁盘,直接传入完整配置创建临时磁盘实例,不会被缓存,适合每个用户FTP配置独立的场景:
$user = Auth::user(); $setting = $user->setting; // 组装完整FTP配置 $ftpConfig = [ 'driver' => 'ftp', 'host' => 'imn.tra.de', 'username' => $setting->user_name, 'password' => $setting->password, 'port' => 21, 'ssl' => true, ]; // 直接生成磁盘实例使用 $customFtpDisk = Storage::build($ftpConfig); $customFtpDisk->put($file, $localFile);
如果你使用的是 Laravel 7 及更早版本,没有
Storage::build方法,可以替换为$customFtpDisk = app('filesystem')->create($ftpConfig);实现相同效果。
方案2:修改配置后清除已缓存的磁盘实例
如果你需要保留预定义的 custom-ftp 磁盘配置,修改配置后先清除缓存的实例,再调用磁盘即可读取新配置:
$user = Auth::user(); $setting = $user->setting; // 注意键名是 disks 复数 Config::set('filesystems.disks.custom-ftp.username', $setting->user_name); Config::set('filesystems.disks.custom-ftp.password', $setting->password); // 清除已经缓存的custom-ftp磁盘实例 Storage::forget('custom-ftp'); // 此时调用会用新配置重新初始化磁盘 Storage::disk('custom-ftp')->put($file, $localFile);
内容的提问来源于stack exchange,提问作者user8076689
相关产品推荐
相关产品推荐

