【PHP】Google Drive APIでファイルをアップロードする方法|OAuth2認証からコードまで解説

2021年3月17日

最小構成版(8月23日更新)はこちらから

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を呼び出す場所:ウェブサーバー
  • アクセスするデータの種類:ユーザーデータ
API設定選択

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

クライアント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バージョン指定を確認し、上記の対処を行ってください。

GCP,PHP

Posted by Next-k