You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 12:08:25