Using the Laravel Filesystem, it's very easy to use cloud providers as regular filesystems.

By default, Amazon S3 (compatible) filesystems are suppported out-of-the-box.

In my setup, I wanted to use Dropbox instead.

As Laravel's filesystem is based on Flysystem, I started with installing a Flysystem driver for Dropbox:

$ composer install spatie/flysystem-dropbox

The next step is to create a provider under app/Providers/DropboxServiceProvider.php:

<?php
<?php

namespace App\Providers;

use Illuminate\Filesystem\FilesystemAdapter;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\ServiceProvider;
use League\Flysystem\Filesystem;
use Spatie\Dropbox\Client;
use Spatie\FlysystemDropbox\DropboxAdapter;

class DropboxServiceProvider extends ServiceProvider
{
    public function register()
    {
    }

    public function boot()
    {
        Storage::extend('dropbox', function ($app, $config) {
            $adapter = new DropboxAdapter(new Client(
                $config['authorization_token']
            ));

            return new FilesystemAdapter(
                new Filesystem($adapter, $config),
                $adapter,
                $config
            );
        });
    }
}

The provider extends the Storage class by adding a custom provider called "dropbox" in our example.

FilesystemAdapater is the link between Flysystem and what Laravel expects.

Don't forget to register your provider in config/app.php under the key providers.

<?php
<?php

return [
    // ...

    'providers' => [
        // ...

        App\Providers\DropboxServiceProvider::class,

        // ...
  ],

    // ...
];

The next step is to add a new filesystem to config/filesystems.php:

<?php
<?php

return [
    // ...

    'disks' => [
        // ...

        'dropbox-backup' => [
            'driver' => 'dropbox',
            'authorization_token' => env('DROPBOX_ACCESS_TOKEN'),
        ],
    ],

    // ...
];

The last step is to generate an access token for Dropbox and add it to your .env file:

DROPBOX_ACCESS_TOKEN=<your-access-token>