【Dropbox】【Laravel】Dropboxを扱うためのライブラリspatie/flysystem-dropboxの紹介

  • 2023年11月6日
  • 2024年2月21日
  • Laravel
追記: この記事の方法はその場では期待通りに動きますがしばらくするとトークンの寿命切れで動かなくなります。これの対処版が次の記事です。

【Dropbox】【Laravel】Dropboxとの通信で expired_access_token とエラーが返って来てしまう時の対処 – 株式会社シーポイントラボ | 浜松のシステム・RTK-GNSS開発

 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

 ざっくり言うと次の流れです。

  1. Dropboxの開発者用ページから「アプリを作成」
  2. 次のURLにブラウザでアクセスしてアクセス
    https://www.dropbox.com/oauth2/authorize?client_id={作ったアプリのApp key}&response_type=code&token_access_type=offline
    
  3. アクセスして得たアクセストークンとアプリのApp key、App secretを用いて次のcURLを実行
    curl https://api.dropbox.com/oauth2/token -d code={取得したアクセストークン} -d grant_type=authorization_code -u {アプリのApp key}:{アプリのApp secret}
    
  4. cURLで返ってきたレスポンスのJSONを保存
  5. 次画像の様にファイルの読み書き権限を追加
  6. 次画像の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上でできるようになります。ストレージのディスクとして登録することもでき、こうしておくとバックアップツールなどの他のストレージを参照するライブラリなどと連携しやすくなります。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG