DropboxのAPIを通して現在稼働しているシステムと連携することができれば、大量のデータを保存できるDropboxをより効率的に活用することができます。そのためには、まずDropboxのAPIの使い方を理解する必要があります。本文書では、PHPのcURLを使ってDropboxに保存されているファイルを操作を通して、Dropbox APIの使い方と理解を深めていきます。もしこれまでに外部サービスとの連携の経験がない人であればDropboxとの連携ができるようになるとGUIを介さずにDropboxの操作を行うことができるのでエンジニアとして一つステップアップした気持ちになれるはずです。

本文書では、cURLをある程度理解している方を対象に記載しています。cURLについて理解が不足している方は、まず下記の記事に目を通してみてください。

本文書を読み終えるとDropboxのAPIを通して下記の操作が行えるようになります。

  • 特定のフォルダの中にあるファイル一覧を表示することができます
  • ファイルを指定したフォルダにアップロードすることができます
  • 保存されているファイルをダウンロードすることができます
  • 保存されているファイルのリンクを取得することができます
  • 保存されているフォルダ/ファイルの存在を取得することができます
  • 新しくフォルダを作成することができます

アプリケーションの作成

Dropboxのアプリケーションを作成するためには、ユーザ登録を行っておく必要があります。

PHPのcURL環境で、Dropboxのファイル操作を行うためには、アプリケーションの作成(Create an App)を行う必要があります。アプリケーションを作成することでDropboxに接続するために必要な認証情報であるアクセストークンの取得を行います。アプリケーションを作成する目的は、アクセストークンを取得することにあります。

アプリケーションの作成は、Dropboxの開発者サイトで行います。以下のリンクからDropboxの開発者サイトに移動してください。
URL : https://www.dropbox.com/developers

下記がDropboxの開発者サイトのトップページです。アプリケーションの作成を行うためには、Dropboxユーザでのログインが必須なので、右上の”Sign in”からログインを行ってください。

dropbox developerトップページ

dropbox developerトップページ

ログイン完了後、真ん中にある”Create your app”をクリックしてください。

Create your app

Create your app

DropboxのAPIとDropbox BusinessのAPIの選択ができますが、今回は、Dropboxのファイル操作を行うので、左側のDropbox APIを選択してください。

dropbox apiの選択

dropbox apiの選択

アクセスできる範囲の選択ができますが、すべてのファイルとフォルダにアクセスできるFull Dropboxを選択します。

アクセスできる範囲の選択とアプリケーションの命名

アクセスできる範囲の選択とアプリケーションの命名

アプリケーションについては、任意の名前のアプリケーション名(3. Name your app)を入れてください。入力すると右下のCreate appボタンがクリック可能になります。

アクセスできる範囲の選択

アクセスできる範囲の選択

アプリケーションの作成が完了すると下記の画面が表示されます。ここでは、アクセストークンを取得する必要があるので、OAuth2のGenerated access tokenの下にあるGenerateボタンをクリックしてください。クリックするとアクセストークンの文字列が表示されます。これが今後必要になるアクセス情報です。それ以外については、入力しなくてもこれから説明を行うcURLでのファイル操作には影響はありません。

my app画面

my app画面

Dropbox内フォルダのファイル一覧を取得する

APIを利用するためには、Dropbox側で用意している各操作用のURL、送信するヘッダーの内容、パラメータを事前に確認しておく必要があります。確認するためには、DevelopersページのDocumentationの下にあるHTTPをクリックしてUser Endpointsに移動します。

HTTP Documentation

HTTP Documentation

右のコラムからDropboxに保存されているファイルのリスト表示を行う/list_foldersを探して、クリックします。

ファイルをリスト化する

ファイルをリスト化する

ファイルのリストを表示したい場合にアクセスするURLの情報(エンドポイント)や、アクセスする際に必要となるパラメータの情報が記載れています。この内容を元にcurlの設定を行います。

list folder設定値

list folder設定値

Dropboxのドキュメントを元に設定したPHPのプログラムは下記の通りになります。(1)の取得したアクセストークンは、アプリケーションの作成時に取得したアクセストークンを入力してください。(2)のファイル一覧を取得したいフォルダのパスは、各自の環境に依存するので、ファイル一覧を取得したいフォルダのパスを記述してください。

ドキュメントにある通り、path以外のパラメータも存在します。そのほかのパラメータ(recursive,include_media_info等)は初期値が決まっているので、今回は省略しています。他のパラメータを設定したい場合は、$post_fields変数の配列にパラメータを追加してください。



        $url = "https://api.dropboxapi.com/2/files/list_folder";

        $headers = [
            'Authorization: Bearer XXXXXX', //(1)取得したアクセストークン
            'Content-Type: application/json'
        ];

        $post_fields = [
            "path" => "/test/" //(2)ファイル一覧を取得したいフォルダのパス
        ];

        $options = [
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HTTPHEADER => $headers,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => json_encode($post_fields) 
        ];

       $ch = curl_init();

       curl_setopt_array($ch, $options);

       $result = curl_exec($ch); 

       curl_close($ch);

       var_dump($result);

上記のプログラムで実行し、下記のような文字列が表示されればAPI経由でのDropboxへのアクセスは成功しています。


string(1498)
"{"entries": 
[{".tag": "file",
  "name": "dropbox\u306eAPI.docx", 
  "path_lower": "/test/dropbox\u306eapi.docx",
  "path_display":"/test/dropbox\u306eAPI.docx", 
  "id": "id:2ozr6e1JbiAAAAAAAAAApA", 
  "client_modified": "2018-11-06T11:22:21Z",

json_decodeを使用してデコードを行うと日本語の文字に変換されるので、実際のファイル名と一致するのか確認することができます。


var_dump(json_decode($result));

testフォルダの下にdropboxのapi.docxというワードファイルがあることを確認できます。ファイル名以外にも修正日時、サイズ等も含まれています。サーバから送られてきた値については、ドキュメントを見ながら確認してください。


object(stdClass)#3067 (3)
 { ["entries"]=> array(3) 
 { [0]=> object(stdClass)#3064 (10)
 { [".tag"]=> string(4) "file"
   ["name"]=> string(18) "dropboxのAPI.docx"
   ["path_lower"]=> string(24) "/test/dropboxのapi.docx"
   ["path_display"]=> string(24)

下記では、サーバから送られてきた情報の中でファイル名だけforeachを使用して取り出し、表示させていきます。


       $result = json_decode($result);

       foreach($result->entries as $entry){

            echo '<p>'.$entry->name.'<p>';

       }

testフォルダには、3つのファイルを保存していたので、ブラウザには保存されてる3つのファイル名が表示されます。

testフォルダのファイル一覧

testフォルダのファイル一覧

DropBoxにファイルをアップロードする

次は、DropboxのAPIを利用して、ファイルのアップロードを行います。Dropboxのドキュメントのuploadのページを開いてパラメータを確認してください。

uploadドキュメント

uploadドキュメント

Dropboxのドキュメントを元に設定したPHPのプログラムは下記の通りになります。

(1)はアップロードを行いたいファイルのパスを設定してください。(2)では、アプリケーションの作成時に取得したアクセストークンを入力してください。(3)は、Dropbox側でファイルをアップロードするパスを設定してください。



        $url = "https://content.dropboxapi.com/2/files/upload";

        $path = './XXX/XXX/アップロード手順.pdf';//(1)

        $fp = fopen($path,'rb');

        $filesize = filesize($path);

        $headers = array(
            'Authorization: Bearer XXXXXXXX', //(2)
            'Dropbox-API-Arg: {"path":"/test/アップロード手順.pdf"}',//(3)
            'Content-Type: application/octet-stream'
        );

       $options = array(
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_URL => $url,
            CURLOPT_HTTPHEADER => $headers,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => fread($fp, $filesize)      
        );

        $ch = curl_init();

        curl_setopt_array($ch, $options);

        $result = curl_exec($ch);
        
        var_dump(json_decode($result));

プログラムを実行後、必ずDropbox側にファイルが作成されていることを確認し、サイズが0でないことも確認してください。プログラムの間違いやcrulの設定に誤りがあるとファイルは作成できているが、ファイルの中身がない(サイズ0)ということも起こりえます。

アップロード完了後、$result変数にサーバからの戻り値が入っているので、こちらでもサイズが0ではないか等確認することができます。戻り値についてはドキュメントを確認してください。


object(stdClass)#3067 (9)
 { ["name"]=> string(28) "アップロード手順.pdf"
   ["path_lower"]=> string(34)"/test/アップロード手順.pdf"
   ["path_display"]=> string(34) "/test/アップロード手順.pdf" 
   ["id"]=> string(25) "id:2ozr6e1JbiAAAAAArQ" 
   ["client_modified"]=> string(20)"2018-11-06T13:31:52Z"
   ["server_modified"]=> string(20) "2018-11-06T13:31:53Z"
   ["rev"]=> string(10) "c75d699c8f"
   ["size"]=> int(133026)
   ["content_hash"]=> string(64) 
上記の設定ではもし同名のファイルが存在する場合は上書きができずエラーになります。ファイルの上書きを許可していい場合は、modeの設定を追加し、overwriteを設定する必要があります。

Dropboxの中のファイルをダウンロードする

次は、DropboxのAPIを利用して、ファイルのダウンロードを行います。DropboxのドキュメントのDownloadのページを開いてパラメータを確認してください。

ダウンロードのパラメータは、ダウンロードしたいDropbox上に保管されているファイルのパスを指定するのみなので、非常にシンプルです。指定法オフはパス以外にもありますが、直感的にわかりやすいパスを指定して行っています。

download

download

(1)では、アプリケーションの作成時に取得したアクセストークンを入力してください。(2)はダウンロードを行いたいファイルのパスを設定してください。$resultには、ダウンロードに指定したファイルのrawデータが入っているので、(3)には、サーバへの保存方法を記述してください。(3)については環境に依存するので、コピーしても動作しません。



        $url = "https://content.dropboxapi.com/2/files/download";

        $ch = curl_init();

        $headers = array(
            'Authorization: Bearer XXXXXXX', //(1)
            'Content-Type: application/octet-stream',
            'Dropbox-API-Arg: {"path":"/test/ダウンロード手順.pdf"}'//(2)
        );

        $options = array(
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HTTPHEADER => $headers,    
        );

        curl_setopt_array($ch, $options);

        $result= curl_exec($ch);

        \Storage::put('ダウンロード手順.pdf',$result);//(3)

        return $result;

Dropboxの中のファイルのリンクを取得する

次は、DropboxのAPIを利用して、ファイルのリンクのURLを取得します。リンクの取得(URL)をし、ブラウザのアドレスバーにコピーすれば、Dropbox内に保存したファイルを手元のPCに直接ダウンロードすることができます。Dropboxのドキュメントのget_temporary_linkのページを開いてパラメータを確認してください。

Dropboxのドキュメントを元に設定したPHPのプログラムは下記の通りになります。

(1)では、アプリケーションの作成時に取得したアクセストークンを入力してください。(2)はリンクを取得したいファイルのパスを設定してください。

get_temporary_link

get_temporary_link



        $url = "https://api.dropboxapi.com/2/files/get_temporary_link";

        $headers = array(
            'Authorization: Bearer XXXXXXX', //(1)
            'Content-Type: application/json'
        );

        $post = array(
            "path" => "/test/ダウンロード手順.pdf"//(2)
        );

        $options = array(
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HTTPHEADER => $headers, 
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => json_encode($post),   
        );

        $ch = curl_init();

        curl_setopt_array($ch, $options);

        $result = curl_exec($ch);

        var_dump(json_decode($result));

プログラム完了後、$result変数にサーバからの戻り値が入っているので、戻り値の中からリンクを取得する必要があります。その他の戻り値についてはドキュメントを確認してください。


object(stdClass)#3067 (2) 
{ ["metadata"]=> object(stdClass)#3064 (9) 
{ ["name"]=> string(28) "ダウンロード手順.pdf"
  ["path_lower"]=> string(34) "/test/ダウンロード手順.pdf"
  ["path_display"]=> string(34) "/test/ダウンロード手順.pdf" 
  ["id"]=> string(25) "id:2ozr6e1JbiAAAAAAAAAArg" 

下記のように記述するとブラウザの画面上にリンクの設定されたファイル名が表示されます。リンクをクリックするとダウンロードが開始されます。


        $file_name = json_decode($result)->metadata->name;

        $link = json_decode($result)->link;

        echo '<a href="'.$link.'">'.$file_name.'</a>';

ブラウザには下記のようなリンクが表示されます。

downloadリンクの表示

downloadリンクの表示

Dropboxの中のフォルダ/ファイルの存在を確認する

次は、DropboxのAPIを利用して、フォルダ/ファイルの存在の確認を行います。フォルダ/ファイルの存在のチェックには、get_metadataを使用しています。get_metadataでは、フォルダ/ファイルが存在する場合は、フォルダ/ファイルに関するメタ情報が返され、存在しない場合は、HTTPコード409で、not_foundのエラーが返されます。

(1)では、アプリケーションの作成時に取得したアクセストークンを入力してください。(2)は存在の確認を行いたいフォルダ/ファイルのパスを設定してください。



        $url ="https://api.dropboxapi.com/2/files/get_metadata";

        $headers = array(
            'Authorization: Bearer XXXXXXX', //(1)
            'Content-Type: application/json'
        );

        $post = array(
            "path" => "/test/"//(2)
        );

        $options = array(
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HTTPHEADER => $headers, 
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => json_encode($post),   
        );

        $ch = curl_init();

        curl_setopt_array($ch, $options);

        $result = curl_exec($ch);

        var_dump(json_decode($result));

フォルダ/ファイルが存在する場合

存在する場合は、下記のようなメタ情報が戻り値に入ります。


object(stdClass)#3067 (5) 
{ [".tag"]=> string(6) "folder" ["name"]=> string(4) "test" 
["path_lower"]=> string(5) "/test" ["path_display"]=> string(5) 
"/test" ["id"]=> string(25) "id:2ozr6e1JbiAAAAAAow" }

フォルダ/ファイルが存在しない場合

存在しないフォルダをパスに設定して、実行するとnot_foundのエラーメッセージが戻されます。


object(stdClass)#3067 (2) 
{ ["error_summary"]=> string(15) "path/not_found/"
  ["error"]=> object(stdClass)#3064 (2) 
{ [".tag"]=> string(4) "path"
  ["path"]=> object(stdClass)#3070 (1) 
{ [".tag"]=> string(9) "not_found" } } }

curlのcurl_getinfoを使ってHTTPコードを確認すると存在した場合は、200。存在しない場合は、409が戻されます。HTTPコードを使用すれば存在の可否を判断することができます。


var_dump(curl_getinfo($ch, CURLINFO_HTTP_CODE));

Dropbox内に新しいフォルダを作成する

次は、DropboxのAPIを利用して、新しいフォルダの作成を行います。get_metadataを利用してフォルダの存在をチェックし、もし存在しない場合は新規でフォルダを作成するといったことが可能になります。



        $url = "https://api.dropboxapi.com/2/files/create_folder_v2";

        $headers = array(
            'Authorization: Bearer XXXXXXX', //(1)
            'Content-Type: application/json'
        );

        $post = array(
            "path" => "/test/new_folder"//(2)
        );

        $options = array(
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HTTPHEADER => $headers, 
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => json_encode($post),   
        );

        $ch = curl_init();

        curl_setopt_array($ch, $options);

        $result = curl_exec($ch);

        var_dump(json_decode($result));

実行後は、Dropboxにフォルダが作成されているかどうか確認を行ってください。変数$resultには、作成したフォルダの情報が入っています。


object(stdClass)#3067 (1)
 { ["metadata"]=> object(stdClass)#3064 (4)
 { ["name"]=> string(9) "new_folder" 
   ["path_lower"]=> string(9) "/test/new_folder" 
   ["path_display"]=> string(16) "/test/new_folder" 
   ["id"]=> string(25) "id:2ozr6e1JbiAAAAAAArw" } }

ここまでの動作確認を行うことができれば社内やサーバ上にあるデータをどのようにDropboxに保存すればDropboxの容量を有効活用できるかなどのアイデアが浮かんでくるかと思います。せっかく覚えた技術を活用してDropboxを有効活用してください。