将文件从 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 步不需要您编写任何代码。参见 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'
));
?>
最后,我想通过 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 步不需要您编写任何代码。参见 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'
));
?>