Laravel 11 SFTP磁盘无法列出目录文件,Laravel 10可正常运行
Laravel 11 SFTP 无法列出Windows服务器目录/文件的问题解决
问题原因
Laravel 11 默认依赖 league/flysystem-sftp-v3,该版本对Windows SFTP服务器的路径处理逻辑与Laravel 10使用的旧版(v2)存在差异。Windows SFTP服务器的盘符路径(如E:/)在v3中无法被正确解析,导致虽然能建立连接,但无法读取目录内容。
解决方案
1. 指定SFTP根目录
在config/filesystem.php的sftp磁盘配置中添加root参数,直接映射到目标盘符,避免手动拼接盘符路径:
'sftp' => [ 'driver' => 'sftp', 'host' => env('SFTP_HOST'), 'username' => env('SFTP_USERNAME'), 'privateKey' => env('SFTP_PRIVATE_KEY'), 'passphrase' => env('SFTP_PASSPHRASE'), 'visibility' => 'private', 'directory_visibility' => 'private', 'root' => 'E:/', // 新增:将根目录指定为E盘 ],
2. 适配路径分隔符
Windows SFTP服务器默认使用反斜杠\作为路径分隔符,若上述配置仍不生效,可尝试使用转义后的反斜杠作为根目录:
'root' => 'E:\\',
3. 调整Scoped磁盘前缀
修改export磁盘的prefix配置,去掉盘符前缀(因为已通过root指定了根目录):
'export' => [ 'driver' => 'scoped', 'disk' => 'sftp', 'prefix' => env('EXPORT_PREFIX', 'serverfolders'), // 移除E:/前缀 ]
4. 验证权限配置
确认SFTP用户user1@myserver.local对E:/serverfolders目录拥有读取、列出目录的NTFS权限,同时检查Windows SFTP服务(如OpenSSH)的配置,确保该目录在用户可访问范围内。
测试验证
调整配置后,执行以下代码验证效果:
// 读取E盘根目录下的所有目录 Storage::disk('sftp')->directories(); // 读取serverfolders目录下的内容 Storage::disk('export')->directories(); Storage::disk('export')->allFiles();
内容的提问来源于stack exchange,提问作者rajwanur
相关产品推荐
相关产品推荐

