【PHP】Google Drive APIでファイルをアップロードする方法|OAuth2認証からコードまで解説
HTMLフォームから送信されたファイルをGoogleドライブに保存したい場合、PHPとGoogle Drive APIを組み合わせることで実現できます。本記事ではOAuth2.0認証の設定からPHPコードの実装まで手順を解説します。
ファイル送信フォームの作成についてはこちらの記事を参照してください。
目次
必要なもの
- クライアントIDのJSONファイル(Google Cloud Consoleで作成)
- 認証後トークンのJSONファイル(初回認証で生成)
ステップ1:クライアントIDのJSONファイルを作成する
Google Cloud Consoleで認証情報を作成します。
https://console.cloud.google.com/apis/dashboard
「認証情報の作成」→「ウィザードで選択」をクリックします。

以下の設定を選択します。
- 使用するAPI:Google Drive API
- APIを呼び出す場所:ウェブサーバー
- アクセスするデータの種類:ユーザーデータ

OAuth同意画面を設定し、OAuth 2.0 クライアントIDを作成します。作成後、JSONファイルをダウンロードします。

ステップ2:認証後トークンのJSONファイルを作成する
以下のURLにパラメータを付けてブラウザでアクセスします。
https://accounts.google.com/o/oauth2/auth
?client_id=[クライアントID]
&redirect_uri=[リダイレクトURI]
&scope=https://www.googleapis.com/auth/drive
&response_type=code
&approval_prompt=force
&access_type=offline
実際のURLの例:
https://accounts.google.com/o/oauth2/auth
?client_id=343xxxxxxxxxxxxxxxx.apps.googleusercontent.com
&redirect_uri=http://localhost
&scope=https://www.googleapis.com/auth/drive
&response_type=code
&approval_prompt=force
&access_type=offline
アクセスして許可すると、リダイレクトURLにcodeパラメータが付きます。このコードを使って以下のリクエストでリフレッシュトークンを取得します。
curl -X POST https://oauth2.googleapis.com/token \
-d client_id=[クライアントID] \
-d client_secret=[クライアントシークレット] \
-d redirect_uri=[リダイレクトURI] \
-d grant_type=authorization_code \
-d code=[取得したcode]
レスポンスのrefresh_tokenを含むJSONをファイルに保存します。
ステップ3:PHPファイルの作成
まずComposerでGoogle APIクライアントライブラリをインストールします。
composer require google/apiclient:^2.0
PHPコードの実装例です。
<?php
require_once 'vendor/autoload.php';
$client = new Google_Client();
$client->setAuthConfig('client_secret.json'); // クライアントIDのJSONファイル
$client->addScope(Google_Service_Drive::DRIVE);
// トークンの設定
$tokenData = json_decode(file_get_contents('token.json'), true);
$client->setAccessToken($tokenData);
// トークンの有効期限が切れたら更新
if ($client->isAccessTokenExpired()) {
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
file_put_contents('token.json', json_encode($client->getAccessToken()));
}
$service = new Google_Service_Drive($client);
// アップロードするファイルの設定
$file = new Google_Service_Drive_DriveFile();
$file->setName('アップロードファイル名.pdf'); // ドライブ上でのファイル名
$file->setParents(['フォルダID']); // アップロード先のフォルダID
$uploadedFile = $service->files->create($file, [
'data' => file_get_contents($_FILES['upload_file']['tmp_name']),
'mimeType' => $_FILES['upload_file']['type'],
'uploadType' => 'multipart',
]);
echo 'アップロード完了: ' . $uploadedFile->getId();
?>
共有フォルダへのアップロード
他のユーザーが所有する共有フォルダにアップロードする場合、スコープをdrive(フル権限)に設定する必要があります。
// 共有フォルダへのアップロード用スコープ
$client->addScope(Google_Service_Drive::DRIVE);
// または
$client->addScope('https://www.googleapis.com/auth/drive');
エラーが発生する場合
Your Composer dependencies require a PHP version ">= 8.0.0"
composer.jsonに以下を追加します。
{
"config": {
"platform": {
"php": "7.4"
}
}
}
その後ターミナルで実行します。
composer update
Parse error: syntax error, unexpected '|’, expecting variable
PHP 8.0未満では共用体型(Union Types)が使えないためエラーが発生します。composer.jsonのPHPバージョン指定を確認し、上記の対処を行ってください。






ディスカッション
コメント一覧
参考にさせていただきました、ありがとうございます!
ただ「PHPファイルの作成」の項で1点だけ。
77行目の $client が未定義でした。
直前に $client = getClient(); を入れれば当方の環境でも
正常に動作しましたのでご報告です。
※「2021年8月23日更新の最小構成版はこちらから」の
ページには $client = getClient(); の記述がありましたので、
何かで間違って消えてしまったのかなと。
ご指摘ありがとうございます!
修正させていただきました!