PHPでDropboxのファイル取得

(1/1)
PHPを使い、Dropbox で共有しているファイルを取得するプログラムを作る。
2018年(平成30年)9月現在、Dropbox API v2 ではPHP用のSDKが用意されていないため、ここではPHP 5以上でフレームワークを必要とせず、PHPのファイル操作関数に似せたメソッドを用意することを目標にする。

(2025年12月20日).pahooEnv導入.PHP8.5対応:curl_closeを実行しないようにした

目次

サンプル・プログラムの実行例

PHPで Dropboxのファイル取得

サンプル・プログラムのダウンロード

圧縮ファイルの内容
.pahooEnvクラウドサービスを利用するためのアカウント情報などを記入する .env ファイル。
使い方は「各種クラウド連携サービス(WebAPI)の登録方法」を参照。include_path が通ったディレクトリに配置すること。
getDropBox.phpサンプル・プログラム本体。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
pahooDropboxAPI.phpDropbox APIクラス pahooDropboxAPI。
Dropbox APIクラスの使い方は「PHPで Dropboxのファイル取得」を参照。include_pathが通ったディレクトリに配置のこと。
getDropBox.php 更新履歴
バージョン 更新日 内容
1.1 2022/02/12 PHP8対応,リファラ・チェック改良
1.0 2018/09/15
pahooInputData.php 更新履歴
バージョン 更新日 内容
2.0.1 2025/08/11 getParam() bug-fix
2.0.0 2025/08/11 pahooLoadEnv() 追加
1.9.0 2025/07/26 getParam() 引数に$trim追加
1.8.1 2025/03/15 validRegexPattern() debug
1.8.0 2024/11/12 validRegexPattern() 追加
pahooDropboxAPI.php 更新履歴
バージョン 更新日 内容
1.3.0 2025/12/20 PHP8.5対応:curl_closeを実行しないようにした
1.2.0 2025/11/29 .pahooEnv導入
1.1 2022/02/12 PHP8対応
1.0 2018/09/14 初版

Dropbox API 利用の準備

Dropbox API 利用の準備
Dropbox API v2 にアクセスし、左図の画面の Create apps をクリックし、必要な情報を入力する。
Dropbox API 利用の準備
APIは "Dropbox API" を選択し、アクセスできるフォルダが必要に応じて、いずれか一方を選択する。

つづいて Dropbox API Explorer にアクセスし、左ペインからどれかAPIを選ぶと、下図の画面になる。
Dropbox API 利用の準備
Get Token をクリックすると、アクセス・トークンが画面に表示される。
PHPプログラムでは、このアクセス・トークンを使ってAPIにアクセスする。
同梱の環境ファイル ".pahooEnv" の定数 PAHOO_DROPBOX_TOKEN にアクセス/トークンの値を記入すること。

解説:pahooDropboxAPI クラス

Dropbox API を利用するためのクラスファイルが "pahooDropboxAPI.php" である。同梱のクラス・ファイル "pahooDropboxAPI.php" は include_path が通ったディレクトリに配置してほしい。他のプログラムでも pahooDropboxAPIクラス を利用するが、常に最新のクラス・ファイルを1つ配置すればよい。

PHPのクラスについては「PHPでクラスを使ってテキストの読みやすさを調べる」を参照されたい。

pahooDropboxAPI.php

  17: // DropboxAPI クラス ========================================================
  18: class pahooDropboxAPI {
  19:     public $webapi;     // 直前に呼び出したAPI URL
  20:     public $error;          // エラーフラグ(エラーがあればTRUE)
  21:     public $errmsg;     // エラーメッセージ(APIが返す error_summary の内容)
  22:     public $responses;      // 直前の結果
  23: 
  24:     // Dropbox API
  25:     // https://www.pahoo.org/e-soul/webtech/php06/php06-64-01.shtm#preparation 参照
  26:     public $DROPBOX_TOKEN = '';
  27: 
  28: /**
  29:  * コンストラクタ
  30:  * @param   なし
  31:  * @return  なし
  32: */
  33: function __construct() {
  34:     if (isset($_ENV['PAHOO_DROPBOX_TOKEN'])) {
  35:         $this->DROPBOX_TOKEN = $_ENV['PAHOO_DROPBOX_TOKEN'];
  36:     }
  37: 
  38:     $this->webapi = '';
  39:     $this->error  = FALSE;
  40:     $this->errmsg  = '';
  41:     $this->responses = NULL;
  42: 
  43:     // PHPバージョン・チェック
  44:     exitIfLessVersion('5.0.0');
  45: }

解説:Dropbox API リクエスト

Dropbox API へのリクエストは、メソッド requestDropboxAPIv2 で処理する。パラメータはPOSTで指定されたURLに投げる。
リクエストは全てhttps通信で処理されることから、「PHPセキュリティ対策:SSL通信を行う」で紹介した cURL 関数群を用いる。

pahooDropboxAPI.php

  83: /**
  84:  * Dropbox API v2:アクセストークンを用いたリクエスト
  85:  * @param   string $url    リクエストURL
  86:  * @param   array  $argv   Dropbox-API-Argに渡すパラメータ配列(省略可能)
  87:  * @param   array  $post   POSTに渡すパラメータ配列(省略可能)
  88:  * @param   string $upload アップロードするデータ
  89:  * @return  bool TRUE:リクエスト成功/FALSE:失敗
  90: */
  91: function requestDropboxAPIv2($url, $argv=NULL, $post=NULL, $upload=NULL) {
  92:     $flagArg = FALSE;
  93:     $headers[] = 'Authorization: Bearer ' . $this->DROPBOX_TOKEN;
  94: 
  95:     // cURLを使ってリクエスト
  96:     $curl = curl_init() ;
  97:     curl_setopt($curl, CURLOPT_URL , $url);
  98:     curl_setopt($curl, CURLOPT_HEADER, 1) ; 
  99:     curl_setopt($curl, CURLOPT_SSL_VERIFYPEER , FALSE); // 証明書は無視
 100:     curl_setopt($curl, CURLOPT_RETURNTRANSFER,  TRUE);      // 結果を文字列で
 101:     curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
 102:     curl_setopt($curl, CURLOPT_TIMEOUT, 5);
 103:     if ($argv !NULL) {
 104:         $headers[] = 'Dropbox-API-Arg: ' . json_encode($argv);
 105:         $flagArg = TRUE;
 106:     }
 107:     if ($upload !NULL) {
 108:         $headers[] = 'Content-Type: application/octet-stream';
 109:         curl_setopt($curl, CURLOPT_POSTFIELDS, $upload);
 110:         $flagArg = FALSE;
 111:     } else if ($post !NULL) {
 112:         $headers[] = 'Content-Type: application/json';
 113:         curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($post));
 114:     }
 115:     curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
 116: 
 117:     $res1 = curl_exec($curl);
 118:     $res2 = curl_getinfo($curl);
 119:     if (PHP_VERSION_ID < 80500) {
 120:         curl_close($curl);
 121:     }
 122:     $res = substr($res1, $res2['header_size']);
 123: 
 124:     // 結果処理
 125:     $this->webapi = $url;
 126:     preg_match("/HTTP\/[0-9\.]+\s([0-9]+)\s(.+)/ims", $res1, $arr);
 127:     if (! isset($arr[2])) {
 128:         $this->error   = TRUE;
 129:         $this->errmsg  = 'Dropbox API failure';
 130:     } else if ($arr[1>300) {
 131:         $json = json_decode($res);
 132:         $this->error   = TRUE;
 133:         $this->errmsg  = $arr[2];
 134:     } else {
 135:         $this->responses = $flagArg ? $res : json_decode($res);
 136:     }
 137:     return (! $this->error);
 138: }

Dropbox API v2:ファイル検索

リクエストURL
https://api.dropboxapi.com/2/files/search

入力パラメータ
フィールド名 要否 内  容
path 必須 検索対象ディレクトリ。Dropboxのパスで指定する。
query 必須 検索パターン。ワイルドカードに加え、正規表現を利用できる。
start 任意 検索開始番号。省略時は0。
max_results 任意 検索でヒットした情報の最大数。省略時は100。
mode 任意 検索対象
filename:ファイル名とフォルダ名
filename_and_content:ファイル名、フォルダ名、及びファイルの内容
deleted_filename:削除したファイル目とフォルダ名
省略時はfilename。
応答データ構造(http) json matches match_type tag filename/content/both metadata .tag ファイル/フォルダの種別 name ファイル名 id ファイルID client_modified クライアント更新日時 server_modified サーバ更新日時 rev ファイルRev size ファイルサイズ(バイト) path_lower フルパス名(小文字) path_display フルパス名 sharing_info 共有情報 matches 結果#2 matches 結果#3 more true/false start 開始番号

pahooDropboxAPI.php

 140: /**
 141:  * Dropbox API v2:パターンにマッチするファイルを探す
 142:  * @param   string $pattern パターン
 143:  * @return  array マッチするファイル・ディレクトリを含む配列/FALSE:存在しない
 144: */
 145: function glob($pattern) {
 146:     $url = 'https://api.dropboxapi.com/2/files/search'; // リクエストURL
 147:     $arr = pathinfo($pattern);
 148:     $post['path']  = $arr['dirname'];
 149:     $post['query'] = $arr['basename'];
 150: 
 151:     $res = array();
 152: 
 153:     if ($this->requestDropboxAPIv2($url, NULL, $post) == FALSE) {
 154:         $res = FALSE;
 155:     } else if (isset($this->responses->matches[0]->metadata->name)) {
 156:         foreach ($this->responses->matches as $mat) {
 157:             $res[] = $mat->metadata->path_display;
 158:         }
 159:     } else {
 160:         $res = FALSE;
 161:     }
 162: 
 163:     return $res;
 164: }

ファイル検索は、組み込み関数  glob  に似せたメソッド glob を用意した。

Dropbox API v2:通常ファイルかどうか

メソッド [#glob:glob] でヒットした内容が、通常ファイルかどうか(フォルダではないかどうか)を検査するために、ファイル検索APIの応答にあるタグ情報をチェックする。

pahooDropboxAPI.php

 166: /**
 167:  * Dropbox API v2:ファイルのタグ情報を取得する
 168:  * @param   string $filename ファイル名(パスを含む)
 169:  * @return  string タグ情報
 170: */
 171: function get_tag($filename) {
 172:     $url = 'https://api.dropboxapi.com/2/files/search'; // リクエストURL
 173:     $arr = pathinfo($filename);
 174:     $post['path']  = $arr['dirname'];
 175:     $post['query'] = $arr['basename'];
 176: 
 177:     if ($this->requestDropboxAPIv2($url, NULL, $post) == FALSE) {
 178:         $res = FALSE;
 179:     } else if (isset($this->responses->matches[0]->metadata->name)) {
 180:         $tag = '.tag';
 181:         $res = $this->responses->matches[0]->metadata->$tag;
 182:     } else {
 183:         $res = FALSE;
 184:     }
 185:     return $res;
 186: }

通常ファイルかどうかを検査するには、組み込み関数  is_file  に似せたメソッド is_file を用意した。

Dropbox API v2:ファイルの内容取得

リクエストURL
https://content.dropboxapi.com/2/files/download

入力パラメータ
フィールド名 要否 内  容
path 必須 ダウンロードするファイルのフルパス名。Dropboxのパスで指定する。
ファイルIDやrevでも指定できる。
応答データ構造(http) json .tag ファイル/フォルダの種別 name ファイル名 id ファイルID client_modified クライアント更新日時 server_modified サーバ更新日時 rev ファイルRev size ファイルサイズ(バイト) path_lower フルパス名(小文字) path_display フルパス名 sharing_info 共有情報 property_groups プロパティ・グループ has_explicit_shared_members true/false content_hash ハッシュ値 data ダウンロード・データ本体

pahooDropboxAPI.php

 215: /**
 216:  * Dropbox API v2:ファイルの内容取得
 217:  * @param   string $filename ファイル名(パスを含む)
 218:  * @return  string ファイル内容/FALSE:失敗
 219: */
 220: function file_get_contents($filename) {
 221:     $url = 'https://content.dropboxapi.com/2/files/download';   // リクエストURL
 222:     $argv['path']  = $filename;
 223: 
 224:     return ($this->requestDropboxAPIv2($url, $argv) == FALSE?
 225:                 FALSE : $this->responses;
 226: }

ファイルの内容取得は、組み込み関数  file_get_contents  に似せたメソッド file_get_contents を用意した。

サンプル・プログラムの流れ

PHPで Dropboxのファイル取得

getDropBox.php

 124: /**
 125:  * Dropboxのファイル取得
 126:  * @param   string $query  検索パターン
 127:  * @return  array(取得データ,WebAPI,エラーメッセージ)
 128: */
 129: function getDropboxTextFile($query) {
 130:     $res = $api = $errmsg = '';
 131:     $pdb = new pahooDropboxAPI();   // Dropbox APIクラス
 132: 
 133:     if ($pdb->iserror()) {
 134:         $errmsg = $pdb->geterror();
 135:     // ファイル検索
 136:     } else if (($files = $pdb->glob($query)) == FALSE) {
 137:         $errmsg = $query . ' : not found';
 138:     // 通常ファイルかどうか
 139:     } else if (! $pdb->is_file($files[0])) {
 140:         $errmsg = $files[0. ' : is not a file';
 141:     // ファイル内容取得
 142:     } else if (($res = $pdb->file_get_contents($files[0])) == FALSE) {
 143:         $errmsg = $files[0. ' : ' . $pdb->geterror();
 144:     }
 145:     $api = $pdb->webapi;
 146:     $pdb = NULL;
 147: 
 148:     return array($res, $errmsg, $api);
 149: }

サンプル・プログラム "getDropBox.php" は、パターン "/memo/*.txt" でファイル検索を行い、最初にヒットしたテキスト・ファイルを画面に表示するというものである。
主な処理はユーザー関数 getDropboxTextFile の通りである。検索パターンは、各自の環境に合わせて変更してほしい。

また、クラス pahooDropboxAPI には、ファイルにデータを書き込んだりアップロードするメソッド、ファイルを削除するメソッドも用意してある。各自の責任において活用してほしい。

参考サイト

(この項おわり)
header