srmklive/flysystem-dropbox-v2
Dropbox V2 adapter for Flysystem, enabling Laravel/PHP apps to store, read, and manage files in Dropbox via the Flysystem filesystem API. Supports common operations like upload/download, listing, deletion, and metadata handling.
Installation
composer require srmklive/flysystem-dropbox-v2
Add to config/filesystems.php:
'dropbox' => [
'driver' => 'dropbox',
'key' => env('DROPBOX_KEY'),
'secret' => env('DROPBOX_SECRET'),
'token' => env('DROPBOX_TOKEN'),
'root' => env('DROPBOX_ROOT', '/'), // Optional: Defaults to root
],
First Use Case
Use the Storage facade to interact with Dropbox like a local filesystem:
use Illuminate\Support\Facades\Storage;
// Upload a file
Storage::disk('dropbox')->put('path/to/file.txt', 'Content');
// Download a file
$contents = Storage::disk('dropbox')->get('path/to/file.txt');
// List directory contents
$files = Storage::disk('dropbox')->files('path/to/directory');
Authentication
DROPBOX_KEY, DROPBOX_SECRET, and DROPBOX_TOKEN in .env.File Operations
put() and get() for file operations.
Storage::disk('dropbox')->put('remote/path', $localFile);
$content = Storage::disk('dropbox')->get('remote/path');
Storage::disk('dropbox')->writeStream('large-file.txt', fopen('local-file', 'r'));
Directory Handling
mkdir() (Dropbox API v2 doesn’t support nested directories directly; use / separators).
Storage::disk('dropbox')->mkdir('folder/subfolder');
files() or allFiles():
$files = Storage::disk('dropbox')->files('path/to/dir');
$allFiles = Storage::disk('dropbox')->allFiles('path/to/dir');
Metadata and Permissions
metadata() to fetch file details:
$metadata = Storage::disk('dropbox')->metadata('path/to/file');
$client = Storage::disk('dropbox')->getAdapter()->getClient();
$link = $client->sharesCreateUrl($metadata['path_display']);
Event Handling
filesystem.updated):
Storage::disk('dropbox')->dispatcher()->listen('*', function ($event) {
// Handle event (e.g., log or trigger actions)
});
Storage::disk('dropbox')-> consistently.$path = 'file.txt';
if (Storage::disk('dropbox')->exists($path)) {
return Storage::disk('dropbox')->get($path);
}
return Storage::disk('local')->get($path);
$adapter->getClient()).API Rate Limits
metadata().lastModified() to check file changes before fetching metadata.Path Handling
/ as a separator, but ensure paths are normalized:
$path = str_replace('\\', '/', $path); // Normalize paths
rtrim($path, '/').Authentication Expiry
dropbox.refresh-token Artisan command.Large File Handling
put() with streams or the Dropbox Upload API.put() may fail silently for large files. Validate file size first:
if (Storage::disk('dropbox')->size('path/to/file') > 150 * 1024 * 1024) {
// Use chunked upload
}
Permissions and Scopes
files.metadata.read, files.content.write).Storage::disk('dropbox')->getAdapter()->getClient()->getLastResponse() for API errors.Enable Logging: Add to config/logging.php:
'channels' => [
'dropbox' => [
'driver' => 'single',
'path' => storage_path('logs/dropbox.log'),
'level' => 'debug',
],
],
Then log API responses:
\Log::channel('dropbox')->debug($adapter->getClient()->getLastResponse());
Common Errors:
401 Unauthorized: Token expired or invalid. Regenerate tokens.403 Forbidden: Insufficient permissions. Check scopes.404 Not Found: Path doesn’t exist. Verify with metadata().Custom Metadata Extend the adapter to handle custom metadata:
$adapter = Storage::disk('dropbox')->getAdapter();
$client = $adapter->getClient();
$customMetadata = $client->filesUpdate($path, [
'client_modified' => time(),
'custom_metadata' => ['key' => 'value'],
]);
Webhooks Use Dropbox webhooks to trigger Laravel events:
Route::post('/dropbox/webhook', function (Request $request) {
event(new DropboxWebhookEvent($request->input()));
});
Flysystem Events Subscribe to Flysystem events for real-time updates:
Storage::disk('dropbox')->addListener('*', function ($event) {
// Handle file operations (e.g., sync with a database)
});
Testing
Use the dropbox-faker package or mock the adapter:
$adapter = Mockery::mock(\SR\Dropbox\DropboxAdapter::class);
Storage::extend('dropbox', function () use ($adapter) {
return new \League\Flysystem\Filesystem($adapter);
});
How can I help you explore Laravel packages today?