将文件从 App Engine 上传到 Google 驱动器

Upload File from App Engine to Google Drive

最后,我想通过 App Engine php 脚本将文件上传到我的 Google 驱动器。

但是,按照https://developers.google.com/drive/web/quickstart/quickstart-php等教程 强制个人登录。我假设在这种情况下,我将不得不使用服务帐户凭据。

从这里,我上传了以下代码以及所需的 API 客户端库文件

<?php
require_once 'autoload.php';
//require_once 'Auth/AssertionCredentials.php';
require_once 'Client.php';
require_once 'Service/Drive.php';

//
$client = new Google_Client();

$client->setApplicationName("blah-blah-00000");
$client->setClientID("000000000000-00000000000000000000000000000000.apps.googleusercontent.com");

$service = new Google_Service_Drive($client);

// This file location should point to the private key file.
$key = file_get_contents("BlahBlah-000000000000.p12");

$cred = new Google_Auth_AssertionCredentials(
  "000000000000-00000000000000000000000000000000@developer.gserviceaccount.com",
  // Replace this with the scopes you are requesting.
  array('https://www.googleapis.com/auth/drive',
        'https://www.googleapis.com/auth/drive.file'),
  $key
);
$client->setAssertionCredentials($cred);


//Insert a file
$file = new Google_Service_Drive_DriveFile();
$file->setTitle('HelloWorld');
$file->setDescription('A test document');
$file->setMimeType('text/plain');

$data = "Hello World!";

$createdFile = $service->files->insert($file, array(
      'data' => $data,
      'mimeType' => 'text/plain',
      'uploadType' => 'media'
    ));

//print_r($createdFile);

?>

访问关联的appspot.com后,页面是空白的。此时,我检查了与该帐户关联的 Google 驱动器;但是没有找到新文件。

我使用服务帐户是否正确?如果这是正确的,我的下一个问题是我是否正确设置了凭据?我是否必须模拟我的用户 account/the 帐户来设置 App Engine 应用程序?

我使用服务帐户是否正确?

可能不会。我看到很多人使用服务帐户,而他们应该使用的是对标准帐户的离线访问。 "At this point, I check the Google Drive associated with the account; however no new files are found"。具体来说,人们没有意识到服务帐户 NOT 与他们的标准帐户相关联,因此在查看标准帐户的云端硬盘时,服务帐户中的文件自然不存在。他们在没有 UI.

的服务帐户中

假设这是正确的,我的下一个问题是我是否正确设置了凭据?

不是。你说“遵循诸如……之类的教程强制个人登录。”没有任何教程显示您的用例,但这并不意味着它无法完成。只是没有人写过关于如何做的教程。

我是否必须模拟我的用户 account/the 帐户来设置 App Engine 应用程序?

您需要:-

  1. 对请求离线访问的帐户进行一次性授权。这将为您提供一个需要保存的刷新令牌。
  2. 然后在您想要访问云端硬盘时使用刷新令牌请求访问令牌。

好消息是第 1 步不需要您编写任何代码。参见 How do I authorise an app (web or installed) without user intervention? (canonical ?)

在遵循 pinoyyid 的 LINK 并使用离线 OAuth2 刷新令牌后,我将代码更新为以下内容

<?php
require_once 'autoload.php';
require_once 'Client.php';
require_once 'Service/Drive.php';

//
$client = new Google_Client();
// Replace this with your application name.
$client->setApplicationName("00000-00000-00000");
$client->setClientID("000000000000-00000000000000000000000000000000.apps.googleusercontent.com");
$client->setClientSecret("XXXXXXXXXXXXXXXXXXXX");
$client->refreshToken("1/KXXXXXXXXXXXXXXXXXXXXXXXXX");

// Replace this with the service you are using.
$service = new Google_Service_Drive($client);

$_SESSION['service_token'] = $client->getAccessToken();

//Insert a file
$file = new Google_Service_Drive_DriveFile();
$file->setTitle('HelloWorld');
$file->setDescription('A test document');
$file->setMimeType('text/plain');

$data = "Hello World!";

$createdFile = $service->files->insert($file, array(
      'data' => $data,
      'mimeType' => 'text/plain',
      'uploadType' => 'media'
    ));

?>