はじめに
Laravelのファイルストレージで外部のサーバーのファイルを取り扱いたい場面に遭遇して解決方法が見つかったのでメモとして残します。
ファイルストレージは標準ではローカル ディスクとAmazon S3、Rackspace、ftp用のアダプタが組み込まれています。調べてみるとFlysystemというライブラリの機能で実現されていて、アダプタを追加すれば様々なデバイスをストレージとして利用できる仕組みになっています。
Laravelには入っていませんがFlysystemには標準でsftpのアダプタが用意されています。これを利用すると任意のsshサーバーをsftp経由でLaravelのストレージとして利用可能です。
手順
-
composer で sftp アダプタのモジュールをインストール
composer require league/flysystem-sftp
-
サービスプロバイダでアダプタを追加する。
<?php namespace App\Providers; use Storage; use League\Flysystem\Filesystem; use League\Flysystem\Sftp\SftpAdapter; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { ... public function boot() { /** * flysystem に sftp 用のアダプタを追加する * @see https://flysystem.thephpleague.com/docs/adapter/sftp/ * @see https://readouble.com/laravel/5.5/ja/filesystem.html#custom-filesystems */ Storage::extend('sftp', function ($app, $config) { return new Filesystem(new SftpAdapter($config)); }); } }
※ サービスプロバイダの詳細は readouble のドキュメントを参照してください。ちなみに
AppServiceProvider
は最初から存在し自由に記述していいサービスプロバイダとなっています。 -
config/filesystems.php
にディスクを追加する。<?php return [ ... /** * sftp アダプタで ssh サーバーを disk として登録する * * @see https://flysystem.thephpleague.com/docs/adapter/sftp/ */ 'rpx' => [ 'driver' => 'sftp', 'host' => '192.168.10.11', 'port' => 22, 'username' => 'vagrant', // 'password' => 'vagrant', 'privateKey' => '/home/vagrant/.ssh/id_rsa', 'root' => 'rpx', 'timeout' => 10, ], ];
接続先サーバーには対応する公開鍵を登録する。
-
ストレージで利用する
Storage::disk('rpx')->put('./a/test.txt', "hello rpx\n");