Dropxboxはクラウドストレージサービスの一つです。Dropboxを利用してファイルの保存、共有などができます。LaravelでDropboxを楽に使うためのライブラリであるspatie/flysystem-dropboxを紹介します。
spatie/flysystem-dropbox: A flysystem driver for Dropbox that uses the v2 API
spatie/flysystem-dropboxはLaravelのファイル操作機能とDropboxをつなげることで他のファイルをどうこうする処理と同じ書き方をできるようにするライブラリです。ライブラリが提供している範囲がFileSystemまでで、Storageから呼び出すにはちょっとコードの追加が必要になりますが、直にAPIを使ってあれこれするよりずっと楽です。
使い方ですが、spatie/flysystem-dropboxの導入の前にDropboxでAPIを使えるようにする必要があります。これは次の記事が詳しいです、
Dropbox APIトークンを取得する
Getting Started – Developers – Dropbox#overview
ざっくり言うと次の流れです。
- Dropboxの開発者用ページから「アプリを作成」
- 次のURLにブラウザでアクセスしてアクセス
https://www.dropbox.com/oauth2/authorize?client_id={作ったアプリのApp key}&response_type=code&token_access_type=offline
- アクセスして得たアクセストークンとアプリのApp key、App secretを用いて次のcURLを実行
curl https://api.dropbox.com/oauth2/token -d code={取得したアクセストークン} -d grant_type=authorization_code -u {アプリのApp key}:{アプリのApp secret}
- cURLで返ってきたレスポンスのJSONを保存
- 次画像の様にファイルの読み書き権限を追加
- 次画像のGenerateボタンからアクセストークンを生成
Dropbox上でやりたいことによっては、やりたいことに合わせて追加でアプリの権限を変える必要があります。権限を変えた場合は改めてアクセストークンを生成する必要があります。
Dropbox上の準備が終わったらPHP側の設定です。spatie/flysystem-dropboxは次コマンドを用いてcomposerでインストールできます。
composer require spatie/flysystem-dropbox
インストールが完了したら設定ファイルとStorageとしてspatie/flysystem-dropboxを呼び出すためのコードの追加です。GitHubの中でspatie/flysystem-dropboxを使用しているプロジェクトを参考にすると紹介する書き方の他、使いやすそうな書き方がいくつか見つかります。次は一例です。
<?php // config/filesystems.php // ファイルシステムの拡張なので既存のファイルシステム設定ファイル内に追記する方が無難です return [ 'disks' => [ 'dropbox' => [ 'driver' => 'dropbox', // .envファイルのDROPBOX_ACCESS_TOKENに先ほど取得したアクセストークンを入れます 'access_token' => env('DROPBOX_ACCESS_TOKEN'), ], ], ];
<?php // app/Providers/AppServiceProvider.php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Contracts\Foundation\Application; use Illuminate\Filesystem\FilesystemAdapter; use Illuminate\Support\Facades\Storage; use League\Flysystem\Filesystem; use Spatie\Dropbox\Client as DropboxClient; use Spatie\FlysystemDropbox\DropboxAdapter; class AppServiceProvider extends ServiceProvider { public function boot(): void { // Storageファサードのextendメソッドを使用して、'dropbox'という名前のカスタムドライバを定義します。 Storage::extend('dropbox', function (Application $app, array $config) { // 設定→DropboxClient→DropboxAdapterとリレーしてDropboxAdapterをインスタンス化します $adapter = new DropboxAdapter(new DropboxClient( $config['access_token'] )); // DropboxAdapterを使って、新しいFilesystemAdapterを作成して返します。 // これによりLaravelのファイルシステム機能でDropboxを使用できるようになります。 return new FilesystemAdapter( new Filesystem($adapter, $config), $adapter, $config ); }); } }
これでDropboxをLaravelのStorageの機能で扱えるようになります。例えば次のように使えます。
// Dropboxのディスクを呼ぶ $storage = Storage::disk('dropbox'); // Laravel備え付けのStorageのメソッドを呼ぶ。 // ルートから再帰的にファイルを取得して表示 $files = $storage->files('/',true); dump($files); // [] // ファイルを保存 $storage->put('hoge/fuga.txt', date('Y-m-d H:i:s')); // 再度取得して表示 $files = $storage->files('/',true); dd($files); // array:1 [▼ // xxx.php:99 // 0 => "hoge/fuga.txt" // ]
こんな感じでspatie/flysystem-dropboxを用いるとDropboxのAPIを使ったファイル操作がLaravel上でできるようになります。ストレージのディスクとして登録することもでき、こうしておくとバックアップツールなどの他のストレージを参照するライブラリなどと連携しやすくなります。