Laravel には、Dropbox API を利用するためのプラグインがたくさんあります。
その中でも、特に有名なプラグインである、「spatie/flysystem-dropbox」の利用方法を説明いたします。
手順としては、あまり複雑な箇所はないと思いますが、
tokenの生成などをプログラムで実装する箇所で躓いたりしましたので、参考になれば幸いです。
また、Dropbox API を利用する場合には、
AppKey、AppSecret、AuthTokenを利用する方法と、RefreshToken を利用する方法があります。
後半は、RefreshToken を利用する方法を説明していきます。
Configure Dropbox as Driver
1 |
$ composer require spatie/flysystem-dropbox |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
Info from https://repo.packagist.org: #StandWithUkraine ./composer.json has been updated Running composer update spatie/flysystem-dropbox Loading composer repositories with package information Updating dependencies Lock file operations: 3 installs, 0 updates, 0 removals - Locking graham-campbell/guzzle-factory (v6.0.0) - Locking spatie/dropbox-api (1.21.1) - Locking spatie/flysystem-dropbox (3.0.0) Writing lock file Installing dependencies from lock file (including require-dev) Package operations: 3 installs, 0 updates, 0 removals - Downloading graham-campbell/guzzle-factory (v6.0.0) - Downloading spatie/dropbox-api (1.21.1) - Downloading spatie/flysystem-dropbox (3.0.0) - Installing graham-campbell/guzzle-factory (v6.0.0): Extracting archive - Installing spatie/dropbox-api (1.21.1): Extracting archive - Installing spatie/flysystem-dropbox (3.0.0): Extracting archive Package fabpot/goutte is abandoned, you should avoid using it. Use symfony/browser-kit instead. Generating optimized autoload files > Illuminate\Foundation\ComposerScripts::postAutoloadDump > @php artisan package:discover --ansi INFO Discovering packages. barryvdh/laravel-dompdf .................................................................................................................. DONE inertiajs/inertia-laravel ................................................................................................................ DONE kyslik/column-sortable ................................................................................................................... DONE laravel/sail ............................................................................................................................. DONE laravel/sanctum .......................................................................................................................... DONE laravel/tinker ........................................................................................................................... DONE maatwebsite/excel ........................................................................................................................ DONE nesbot/carbon ............................................................................................................................ DONE nunomaduro/collision ..................................................................................................................... DONE nunomaduro/termwind ...................................................................................................................... DONE spatie/laravel-ignition .................................................................................................................. DONE tightenco/ziggy .......................................................................................................................... DONE 93 packages you are using are looking for funding. Use the `composer fund` command to find out more! > @php artisan vendor:publish --tag=laravel-assets --ansi --force INFO No publishable resources for tag [laravel-assets]. Found 1 security vulnerability advisory affecting 1 package. Run composer audit for a full list of advisories. Using version ^3.0 for spatie/flysystem-dropbox |
AppServiceProviderの追加
追加前
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { /** * Register any application services. */ public function register(): void { // } /** * Bootstrap any application services. */ public function boot(): void { // } } |
追加後
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<?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 { /** * Register any application services. */ public function register(): void { } /** * Bootstrap any application services. */ public function boot(): void { Storage::extend('dropbox', function (Application $app, array $config) { $adapter = new DropboxAdapter(new DropboxClient( $config['authorization_token'] )); return new FilesystemAdapter( new Filesystem($adapter, $config), $adapter, $config ); }); } } |
config/filesystems.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php return [ ... ... 'disks' => [ 'dropbox' => [ 'driver' => 'dropbox', 'key' => env('DROPBOX_APP_KEY'), 'secret' => env('DROPBOX_APP_SECRET'), 'authorization_token' => env('DROPBOX_AUTH_TOKEN'), ], ], ] |
Dropbox側の準備
Get Dropbox API Key & Secret & Access Token を取得します。
基本的には、画面の指示どおりに進めていきます。
※ファイルなどのアクセス権限を変更した場合には、再度、AccessTokenを取得しなおします。
Upload File using Dropbox
1 2 3 4 5 |
/* Simple Put File */ Storage::disk('dropbox')->put('sample.txt', "HogeHoge"); /* Simple Get File Content */ Storage::disk('dropbox')->get('sample.txt'); |
Refresh Token を利用する場合
Refresh Token の取得
下記のリンクから、AccessTokenを取得します。
APP_KEYは、上記で取得した APP_KEYを指定します。
取得したAccessToken から、curl で Refresh Token を取得します。
1 2 3 4 |
$ curl https://api.dropbox.com/oauth2/token \ -d code=上記で取得した AccessToken \ -d grant_type=authorization_code \ -u $DROPBOX_APP_KEY:$DROPBOX_APP_SECRET |
1 2 3 4 5 6 7 8 9 |
{ "access_token": "sl.Bf7AAA_q6v9W9PpXXXXX_DQXXXXX96W087XXX5zmKot7XXXX1JTz6lQMQpXXXxf55uh9TtXXXX6N_O_-srizKeBUcXXXtozXXX0nAeNrVXXXX968rXFXXkrmbnpAWpLcp01OR", "token_type": "bearer", "expires_in": 14400, "refresh_token": "ZZZZZZ4AAAAAAAAAAfnXuHXI1hBMGmHHKJHKHKWFDNEooAljZZZZZZ", "scope": "account_info.read account_info.write contacts.read contacts.write file_requests.read file_requests.write files.content.read files.content.write files.metadata.read files.metadata.write sharing.read sharing.write", "uid": "1333707569", "account_id": "dbid:HJHLHJHASf-JKLJJLKIC6hFo7Zys" } |
上記で取得した、refresh_token を、 .env に設定します。
詳細については、下記の参考サイトを確認してください。
プログラムで取得する場合の参考例
1 2 3 4 5 6 7 8 9 10 |
$response = Http::asForm() ->post('https://api.dropbox.com/oauth2/token', [ 'code' => $access_token, 'grant_type' => 'authorization_code', 'client_id' => 'xxxxxxxx', 'client_secret' => 'zzzzzzzzz', ]); $ret = $response->json(); |
refresh token で対応する場合の参考サイト
laravel-dropbox-with-short-lived-access-token
https://github.com/Asano-Naoki/laravel-dropbox-with-short-lived-access-token/
日本語版のドキュメントも充実しているので、手順書通りに対応できると思います。
https://github.com/Asano-Naoki/laravel-dropbox-with-short-lived-access-token/blob/main/README_ja.md
参考サイト
spatie/dropbox-api
https://github.com/spatie/dropbox-api
Laravel Storage Dropbox Integration Example
https://www.itsolutionstuff.com/post/laravel-5-dropbox-api-file-upload-example-using-league-flysystem-dropbox-packageexample.html
Laravel Dropbox api File Upload example using league/flysystem-dropbox
https://www.codesolutionstuff.com/laravel-dropbox-api-file-upload-example
Dropbox APIトークンを取得する
https://zenn.dev/yakumo/articles/75d3df651d0609