簡単!LaravelでDropboxにアップロード&ダウンロード

さてさて、長年Laravelの開発に携わっているのである程度公式ドキュメントは全て目を通している(と思いこんでいる😅)んですけど、そこはやはり奥が深いフレームワークですね。先日もファイル操作をするための「File Storage」のページで、とある項目を発見しました。

それは、

独自のファイルシステム(Custom Filesystems)

です。

つまり、amazon S3SFTPで外部サーバーへ保存するだけでなく独自のファイル保存システムを作成できるという機能ですね。

そして、ドキュメントにはサンプルとしてDropbox(パソコンやスマホのファイルをどこからでも共有できるサービス。無料版もあり)と統合する方法が書かれていました。

・・・とは言ってもメインの機能ではないためか、それほど詳しく書かれているわけではありませんでした(何より興味が湧いてきた)ので自由時間を使って一度試してみることにしました。

ということで、業務で使うことはあまりないかもしれませんが、Dropboxは個人的なストレージとしてはとても便利だと思うので備忘録として残して置くことにしました。

興味ある方はぜひ参考にしてみてくださいね。😊✨

開発環境: Laravel 5.8

Dropbox側の準備をする

まずウェブサイトからDropboxのファイルを操作するためには、Dropbox APIを使います。そのため、まずはこのAPIにアクセスするためのアクセストークンを取得しましょう。

まずは通常通りログインページでログインをしてください。

そして、ログインした状態でApp consoleへ移動します。

すると、以下のようにアプリケーションを登録するボタン「Create app」が表示されるのでこれをクリックします。

ボタンをクリックすると、APIの設定画面が表示されるので、

  1. 個人で利用する「Dropbox API」
  2. Dropbox全体にアクセスができるようにする
  3. Laravel 5.8 TESTという名前

を入力します。(←適宜ご自身に合わせてください)

入力が終わったら、利用規約に同意して「Create app」ボタンをクリックしましょう。

すると、登録したアプリケーションの詳細ページが表示されるので、ページ中程にある「OAuth 2」という項目の「Generate」というリンクをクリックしてアクセストークンを作成します。

クリックすると以下のようにアクセストークンが表示されます(ちなみに注意書きには「このトークンは誰にも教えちゃダメ!」と書かれています。本当に全てのファイルにアクセスできてしまうので秘密にしておいてください)

では、このトークンをLaravelのどこからでも参照できるように.envconfig/filesystems.phpに以下のように追加しておきましょう。

.env

DROPBOX_ACCESS_TOKEN=*************************************

config/filesystems.php

'disks' => [

    // 省略

    'dropbox' => [
        'driver' => 'dropbox',
        'access_token' => env('DROPBOX_ACCESS_TOKEN')
    ]

Laravel側の準備をする

では続いてLaravel側の準備をします。
まず、公式ドキュメントでも紹介されているspatie/flysystem-dropboxというパッケージをcomposerでインストールします。

composer require spatie/flysystem-dropbox

インストールが完了したらDropbox専用のサービスプロバイダー「app/Providers/DropboxServiceProvider.php」を作成します。

<?php

namespace App\Providers;

use Storage;
use League\Flysystem\Filesystem;
use Illuminate\Support\ServiceProvider;
use Spatie\Dropbox\Client as DropboxClient;
use Spatie\FlysystemDropbox\DropboxAdapter;

class DropboxServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Storage::extend('dropbox', function ($app, $config) {
            $client = new DropboxClient(
                $config['access_token']
            );

            return new Filesystem(new DropboxAdapter($client));
        });
    }
}

そして、ファイルを作成するだけではLaravelからは利用できないのでconfig/app.php内の「providers」の項目に登録します。

'providers' => [

    // 省略

    App\Providers\DropboxServiceProvider::class,

これで設定は完了です。

実際に使ってみる

では、実際にDropboxにファイルをアップロード&ダウンロードしてみましょう。

アップロードする

では、ローカルにあるファイル「test.txt」をDropboxへアップロードしてみます。

$path = storage_path('text/test.txt');
\Storage::disk('dropbox')->put('test.txt', $path);

実行した後にDropboxをチェックします。

うまくアップロードされました!

ダウンロードする

では次に先ほどのファイルの名前をtest_from_dropbox.txtに変更して今度はLaravel側へ保存してみましょう。

$contents = \Storage::disk('dropbox')->get('test_from_dropbox.txt');
\Storage::disk('local')->put('test_from_dropbox.txt', $contents);

やっているのは、1行目でDropboxからファイルの中身を取り出し、2行目でローカルへ保存しているだけです。

※ わかりやすく区別をしたかったのでdisk('local')としていますが設定によっては省略できます。

コードを実行すると以下のようにファイルをダウンロードすることができました。

成功です!

ちなみに

今回は独自のファイルシステムを作っているので、いつもと同じくLaravelが提供しているストレージ機能を利用することができます。興味のある方はLaravel でファイルを外部ストレージ(SFTP)へ保存・取得する全13実例をご覧ください。

おわりに

このブログを解説してから早2年が経ち、いろいろと訪問者様からご質問やご指摘をいただいていてありがたい限りです。

つい先日も「CSSが二重に呼び出されていますよ」とソースコードレベルのご指摘をしていただき修正をさせてもらいました。

そして、このブログでは基本的に何か貢献していただいた際にはお礼ということでGitHubへのリンクを紹介させていただいているので、今回もここでご紹介をさせていただこうと思います(ご本人には許可をいただいています)

つよぽんさん、どうもありがとうございました。
つよぽんさんはWeb白熱教室というIT系ブログも運営しているようですので、ぜひそちらもアクセスしてみてください😊

ということで今回はLaravelからDropboxのファイルを操作する方法を紹介しました。このテクニックを使えば、cronを使って定期的に気になるニュースをテキストファイルに保存しておいたり、いろいろな使い方ができると思います。

ぜひ皆さんも試してみてはいかがでしょうか。

ではでは〜!

「Dropbox便利ですね!」

この記事が役立ちましたらシェアお願いします😊✨