如何通过Drive API(PHP客户端)创建公共Google Doc

时间:2013-08-17 18:16:03

标签: google-api google-drive-api google-api-client google-api-php-client

这是我迄今为止所做的,将thisthis结合起来:

require_once "google-api-php-client/src/Google_Client.php";
require_once "google-api-php-client/src/contrib/Google_DriveService.php";
require_once "google-api-php-client/src/contrib/Google_Oauth2Service.php";

//First, build a Drive service object authorized with the service accounts
$auth = new Google_AssertionCredentials(
    DRIVE_SERVICE_ACCOUNT_EMAIL,
    array( DRIVE_SCOPE ),
    file_get_contents( DRIVE_SERVICE_ACCOUNT_KEY )
);
$client = new Google_Client();
$client->setUseObjects( true );
$client->setAssertionCredentials( $auth );
$service = new Google_DriveService( $client );

//Then, insert the file
$file = new Google_DriveFile();
$file->setTitle( 'My document' );
$file->setMimeType( 'text/plain' );
$createdFile = $service->files->insert( $file, array(
    'data' => 'Hello world!',
    'mimeType' => 'text/plain',
));

print_r( $createdFile );

它有效,这意味着它创建了一个text / plain文件,并返回一个包含元数据的数组。但是,我想要的是创建一个Google文档,而不是text / plain。我当然尝试将mime类型(两个外观)更改为“application / vnd.google-apps.document”,但得到以下内容:

致命错误:未捕获的异常'Google_ServiceException',消息为'错误调用POST https://www.googleapis.com/upload/drive/v2/files?uploadType=multipart :( 400)错误请求'/ local / path / to / google-api-php-client / src / io / Google_REST .PHP:66

另外,我需要将文档公开访问。当我通过上面的方法上传文本/纯文件,然后尝试浏览它(从上传者的不同帐户),我被告知我需要许可。我仔细查看了$createdFile中的数组并注意到一个没有值的'共享'键,所以我很天真地尝试将它设置为1:

$file->setShared( 1 );

它没有用,而且,当我再次查看数组时,我注意到'共享'键仍然没有赋值给它。我在网上查了可能对我有帮助的任何文件,但没有运气。有人可以帮帮我吗?谢谢!

2 个答案:

答案 0 :(得分:7)

经过大量的阅读和测试,我找到了问题的答案。

问题是文件的“数据”参数:Google文档不能将纯文本作为数据(他们的数据需要包含一些标题或其他内容)。因此,通过删除'data'参数(以及'mimeType',为什么不),我得到的错误消失了。

关于权限,解决方案是首先使用默认权限创建文件,然后添加一个新文件。

下面我粘贴最小代码以创建可公开访问的Google文档:

require_once "google-api-php-client/src/Google_Client.php";
require_once "google-api-php-client/src/contrib/Google_DriveService.php";
require_once "google-api-php-client/src/contrib/Google_Oauth2Service.php";

//Build the Drive Service object authorized with your Service Account
$auth = new Google_AssertionCredentials(
    DRIVE_SERVICE_ACCOUNT_EMAIL,
    array( DRIVE_SCOPE ),
    file_get_contents( DRIVE_SERVICE_ACCOUNT_KEY )
);
$client = new Google_Client();
$client->setUseObjects( true );
$client->setAssertionCredentials( $auth );
$service = new Google_DriveService( $client );

//Create the file
$file = new Google_DriveFile();
$file->setTitle( 'Hello world!' );
$file->setMimeType( 'application/vnd.google-apps.document' );
$file = $service->files->insert( $file );

//Give everyone permission to read and write the file
$permission = new Google_Permission();
$permission->setRole( 'writer' );
$permission->setType( 'anyone' );
$permission->setValue( 'me' );
$service->permissions->insert( $file->getId(), $permission );

print_r( $file );

答案 1 :(得分:1)

我已将其作为Moodle LMS系统中的插件实现,这里是源代码,其中包含一个实现创建和设置文档适当权限的PHP类。 https://github.com/nadavkav/moodle-mod_googledrive

实际相关课程在这里: https://github.com/nadavkav/moodle-mod_googledrive/blob/master/classes/googledrive.php