Using Dropbox as a static data resource for a modern PHP App
We have recently written about why and how to use AWS S3 as a cloud storage for your PHP App, especially for users of our New Apps. Many have a Dropbox account. Now, you can also "misue" your Dropbox to store your Apps uploads and other static assets. The here described work-flow is quirky, we don't really recommend to use it, but we want to share with you what we have learned:
Setup a folder with Dropbox
First, you'll need to setup a public folder with Dropbox. If you don't already have a folder named
Public on top level, please create a folder called
Public on top level and then click here, to enable it — quirk.
Within the public folder, create a sub-folder for your App, eg
Once you did that, it should look like this:
Switch now into that folder, upload something (eg a random
.html file) and copy it's public link:
It should look somthing like this:
The important part you need to remember is of course
Setup developer credentials for Dropbox
Simplified, Dropbox knows two kind of permissions:
- Access to a dedicated App folder
- Access to everything
Since you must use the
Public folder to make your files accessible by everybody, there is no choice but to use access to everything — major quirk.
If you're logged in, just go to the App create page:
Click on Create app. On the next page generate you need to get your App secret (click on
Show right to App secret) and must generate a new access token (click on
Generate below Generate access token). The App key is not needed.
That's about it for Dropbox.
Using Flysystem to upload
Now that all of that is done, let's try to read & write files with the Dropbox adapter for flysystem. You want to install
league/flysystem-dropbox, which depends on
league/flysystem via Composer.
Following a simplistic upload handler:
<?php use League\Flysystem\Dropbox\DropboxAdapter; use League\Flysystem\Filesystem; use Dropbox\Client; include __DIR__. "/vendor/autoload.php"; // access token and app secret from before.. you don't need the app key $client = new Client($accessToken, $appSecret); $adapter = new DropboxAdapter($client, "Public/my-app"); $filesystem = new Filesystem($adapter); $stream = fopen($_FILES[$uploadname]['tmp_name'], 'r+'); $filesystem->writeStream('uploads/'.$_FILES[$uploadname]['name'], $stream); fclose($stream);
Of course, if you are using a framework, this will be far more elegant. Checkout these recipes.
Now that's the easy part. With the public URL from above, any file you upload will be available at:
Dropbox currently does not support directory listing, which is a good thing IMHO.