通过PHP获取共享Google云端硬盘电子表格文件的内容

时间:2016-02-11 05:58:49

标签: php google-drive-api

我的应用程序支持从Excel文档导入数据。我想通过复制粘贴链接(而不是保存并从下载文件夹中选择)添加对从Google云端硬盘电子表格导入数据的支持。

此代码适用于公开可用的文件(通过共享链接):

$url = 'https://spreadsheets.google.com/feeds/download/spreadsheets/Export?key=...&exportFormat=xlsx';
file_put_contents('path/to/file.xlsx', file_get_contents($url));

然后我将保存文件路径传递给导入器,它可以正常工作。

对于私人文件,此代码没有意义,因为我们获取了权限错误并且检索了HTML而不是Excel数据。

我安装了最新版本的google/google-api-php-client,按照Using OAuth 2.0 for Web Server Applications文章中描述的步骤进行操作。

我的oauth2callback.php文件内容:

<?php

require_once '../../vendor/autoload.php';

session_start();

$client = new Google_Client;
$client->setAuthConfigFile('/path/to/google_auth_config.json');
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');
$client->addScope(Google_Service_Drive::DRIVE_METADATA_READONLY);
$client->setAccessType('offline');

if (!isset($_GET['code'])) {
    $authUrl = $client->createAuthUrl();
    header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL));
} else {
    $client->authenticate($_GET['code']);
    $_SESSION['access_token'] = $client->getAccessToken();
    $redirectUri = 'http://' . $_SERVER['HTTP_HOST'] . '/';
    header('Location: ' . filter_var($redirectUri, FILTER_SANITIZE_URL));
}

主要代码如下:

$client = new Google_Client;
$client->setAuthConfig('/path/to/google_auth_config.json');
$client->addScope(Google_Service_Drive::DRIVE_METADATA_READONLY);

if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
    $client->setAccessToken($_SESSION['access_token']);
    $driveService = new Google_Service_Drive($client);    
    $fileId = '...';
    // For testing purposes
    $file = $driveService->files->get($fileId);
    $content = $driveService->files->get($fileId, ['alt' => 'media']);   
    $content = $driveService->files->export(
        $fileId,
        'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
        ['alt' => 'media']
    );       
} else {
    $redirectUri = 'http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php';
    header('Location: ' . filter_var($redirectUri, FILTER_SANITIZE_URL));
}

此:

$file = $driveService->files->get($fileId);

工作正常,我得到有效的Google_Service_Drive_DriveFile实例。

下载示例来自Download Files文档。

此:

$content = $driveService->files->get($fileId, ['alt' => 'media']);

抛出异常:

{
    "error": {
        "errors": [
            {
                "domain": "global",
                "reason": "badRequest",
                "message": "The specified file does not support the requested alternate representation.",
                "locationType": "parameter",
                "location": "alt"
            }
        ],
        "code": 400,
        "message": "The specified file does not support the requested alternate representation."
    }
}

此:

$content = $driveService->files->export(
    $fileId,
    'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    ['alt' => 'media']
);       

给出错误:

  

调用未定义的方法Google_Service_Drive_Files_Resource :: export()

用户拥有此共享文件夹的编辑权限,downloadUrl中的exportLinksnull属性为$file,但我可以获得title等属性。< / p>

有什么想法吗?

我在Google_Http_Request看到了其他一些例子,但是这已被Guzzle取代,所以它现在没用了。

1 个答案:

答案 0 :(得分:2)

  

指定的文件不支持请求的替代表示。

关于这个问题似乎有another post here。基本上它表明Sheets没有媒体。获取表格文件时,您可以尝试删除alt=media参数。

  

调用未定义的方法Google_Service_Drive_Files_Resource :: export()

命名空间中未定义export方法。检查您是否正在使用您引用的链接上指示的php客户端仓库的v1-branchv1-branch Service.php似乎有导出方法,因此可能有效;是master Drive.php没有一个(导致错误)