如何配置SCP/SFTP文件存储?

13

我的Laravel应用程序应该将文件复制到另一个远程主机。远程主机只能通过带有私钥的SCP访问。我想配置一个新的文件存储类似于FTP),但是我没有找到如何定义SCP驱动程序的信息。

2个回答

37

您需要安装SFTP驱动程序,以供Flysystem使用,Flysystem是Laravel用于其文件系统服务的库:

composer require league/flysystem-sftp

以下是一个示例配置,您可以进行修改。将其添加到config/filesystems.php中的disks数组中:

'sftp' => [
    'driver' => 'sftp',
    'host' => 'example.com',
    'port' => 21,
    'username' => 'username',
    'password' => 'password',
    'privateKey' => 'path/to/or/contents/of/privatekey',
    'root' => '/path/to/root',
    'timeout' => 10,
]

通过将以下代码添加到AppServiceProvider(或其他适当的服务提供者)的boot()方法中,使用新驱动程序扩展Laravel的文件系统:


use Storage;
use League\Flysystem\Filesystem;
use League\Flysystem\Sftp\SftpAdapter;
...
public function boot()
{
    Storage::extend('sftp', function ($app, $config) {
        return new Filesystem(new SftpAdapter($config));
    });
}

那么你可以像操作本地文件系统一样使用 Laravel 的 API:

Storage::disk('sftp')->put('path/filename.txt', $fileContents);

谢谢。看起来很有前途。我安装了 SFTP 驱动并添加了配置,但是我收到了以下错误信息:“[InvalidArgumentException] 不支持驱动程序 [sftp]。” - Antonín Slejška
我按照 https://github.com/thephpleague/flysystem-sftp 上的描述进行了配置,它完美地工作了。虽然我不能使用 Storage 外观,但对我来说还是可以的。 - Antonín Slejška
SFTP登录并列出文件大约需要8-10秒钟的时间。我做错了什么吗?还是这是SFTP登录服务器和访问文件的正常时间? - code-8
@cyber8200 这取决于目录列表中的文件数量和网络条件。当然,位于不同地区的服务器上有数千个文件的目录比位于同一建筑物中只有少量文件的目录需要更长时间。如果您在使用SFTP时遇到延迟问题,并且经常需要列出目录内容,则可以尝试通过SSH获取列表。您还可以检查它是否正在进行递归目录列表。 - Cy Rossignol
如果我运行SCP命令,它会立即下载,因此网络连接非常快。 - code-8
如何删除文件? - Yohanim

2
现在,官方文档提供了SFTP连接的说明:https://laravel.com/docs/8.x/filesystem#sftp-driver-configuration SFTP: composer require league/flysystem-sftp "~1.0"

SFTP驱动程序配置 Laravel的Flysystem集成与SFTP非常适配; 但是,框架默认的filesystems.php配置文件中没有包含示例配置。 如果你需要配置SFTP文件系统,可以使用下面的配置示例:

'sftp' => [
        'driver' => 'sftp',
        'host' => 'example.com',
        'username' => 'your-username',
        'password' => 'your-password',
    
        // Settings for SSH key based authentication...
        'privateKey' => '/path/to/privateKey',
        'password' => 'encryption-password',
    
        // Optional SFTP Settings...
        // 'port' => 22,
        // 'root' => '',
        // 'timeout' => 30,
    ],

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接