【Laravel11】dropboxからファイルの内容を取得
参考元
手順
基本的に参考元の手順で進めていきます!
だけど、記事がなくなったりした時わからなくなるから、ここにも書いておきます
DropBoxでアプリケーションを作成
files.content.read にチェックを入れる
アクセストークンを取得
URLをブラウザで入力
https://www.dropbox.com/oauth2/authorize?client_id={作ったアプリのApp key}&response_type=code&token_access_type=offline
許可すると画像の様なのが出るはずだから、赤枠部分をコピーする
{ }内の値を変更してからcURLコマンドを実行する
curl https://api.dropbox.com/oauth2/token -d code={コピーした値を張り付け} -d grant_type=authorization_code -u {アプリのApp key}:{アプリのApp secret}
App Key・Secretの取得方法
リフレッシュトークンを取得する
赤枠部分をコピーする
トークンが出たと思うから、
DROPBOX_APP_KEY={アプリキー}
DROPBOX_APP_SECRET={アプリシークレットキー}
DROPBOX_REFRESH_TOKEN={リフレッシュトークン}
名前は好きなのでよろしぃ(わかりやすいのにしてるだけ
Composerでパッケージインストール
composer require spatie/flysystem-dropbox
appフォルダのphpに記述
<?php
// ファイルシステムの拡張だから、既存のファイルシステム設定ファイル内に追記する
return [
'disks' => [
'dropbox' => [
'driver' => 'dropbox',
'app_key' => env('DROPBOX_APP_KEY'),
'app_secret' => env('DROPBOX_APP_SECRET'),
'refresh_token' => env('DROPBOX_REFRESH_TOKEN'),
],
],
];
<?ph
namespace App\Service\Dropbox;
use Spatie\Dropbox\TokenProvider;
// TokenProviderインターフェースを実装するAutoRefreshingDropboxTokenServiceクラスです。
class AutoRefreshingDropboxTokenService implements TokenProvider
{
// コンストラクタです。Dropbox APIのキー、シークレット、リフレッシュトークンをプライベート変数として保持します。
public function __construct(
private readonly string $key,
private readonly string $secret,
private readonly string $refreshToken,
) {
}
// アクセストークンを取得するためのメソッドです。
public function getToken(): string
{
// HTTPクライアントを生成します。
$client = new \GuzzleHttp\Client();
// DropboxのAPIにアクセスしてトークンを更新するリクエストを送信します。
$res = $client->request("POST", "https://{$this->key}:{$this->secret}@api.dropbox.com/oauth2/token", [
'form_params' => [
'grant_type' => 'refresh_token', // リフレッシュトークンを使って新しいアクセストークンを要求することを指定します。
'refresh_token' => $this->refreshToken, // 実際のリフレッシュトークンの値を指定します。
]
]);
// リクエストが成功したかどうかのステータスコードをチェックします。
if($res->getStatusCode() == 200) {
// 成功した場合、新しいアクセストークンを返します。
return json_decode($res->getBody(), true)['access_token'];
} else {
// 失敗した場合、エラーを投げます
throw new \RuntimeException($res->getBody());
}
}
}
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Filesystem\FilesystemAdapter;
use Illuminate\Support\Facades\Storage;
use League\Flysystem\Filesystem;
use Spatie\Dropbox\Client as DropboxClient;
use Spatie\FlysystemDropbox\DropboxAdapter;
class AppServiceProvider extends ServiceProvider
{
public function boot(): void
{
// Storageファサードのextendメソッドを使用して、'dropbox'という名前のカスタムドライバを定義します。
Storage::extend('dropbox', function (Application $app, array $config) {
// 設定→AutoRefreshingDropboxTokenService→DropboxClient→DropboxAdapterとリレーしてDropboxAdapterをインスタンス化します
$tokenProvider = new AutoRefreshingDropboxTokenService(
$config['app_key'],
$config['app_secret'],
$config['refresh_token']
);
$client = new \Spatie\Dropbox\Client($tokenProvider);
$adapter = new \Spatie\FlysystemDropbox\DropboxAdapter($client);
// DropboxAdapterを使って、新しいFilesystemAdapterを作成して返します。
// これによりLaravelのファイルシステム機能でDropboxを使用できるようになります。
return new FilesystemAdapter(
new Filesystem($adapter, $config),
$adapter,
$config
);
});
}
}
dropboxのファイル内容を取得したいControllerに記述
function getFile(){
// dropboxストレージに接続
$storage = Storage::disk('dropbox');
// ファイルにアクセスをして中身を取得
$json = $storage->get('アクセスしたいファイルパス');
// jsonとかの場合、dump() を使うと折り畳みが可能になる
dump(json_decode($json));
}