使用Google Picker从Google云端硬盘下载文件

时间:2013-09-01 12:52:58

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

我正在尝试构建一个网页,用户可以使用Google Picker从Google云端硬盘中选择图像,并使用PHP脚本将所选文件下载到我的服务器。

我设法设置了Picker,我得到了fileID,但是当我将这些ID传递给我的后端并尝试GET方法时,我收到了身份验证错误。

我花了两天时间研究和研究,但更多的是我阅读谷歌官方文档,我更加困惑。

有人可以告诉我,或者链接我的例子如何实现这个?是否有可能以某种方式将oAuthv2令牌从GooglePicker传递到我的PHP后端,然后将该令牌与GET请求一起使用?

非常感谢你!

编辑:

这是我尝试获取https://www.googleapis.com/drive/v2/files/SOME_FILE_ID

时出现的错误
{
 "error": {
  "errors": [
   {
    "domain": "usageLimits",
    "reason": "dailyLimitExceededUnreg",
    "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.",
    "extendedHelp": "https://code.google.com/apis/console"
   }
  ],
  "code": 403,
  "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup."
 }

3 个答案:

答案 0 :(得分:4)

在致电GET之前,您必须设置一个包含最新访问令牌的授权标题。

如果您想手动执行此操作,请执行以下步骤: -

  1. 使用您的app-id / client-id和范围请求权限。这将返回给您一个授权码。
  2. 使用授权码来请求刷新令牌和访问令牌
  3. 存储刷新令牌以供将来使用
  4. 在http标头授权中设置访问令牌(类似授权:Bearer ya29.AHES6ZR3HQa9trJM_IQcgNlM0SI4FvLQFiQfcAZCWLobfpjqtGlT6A)
  5. 发出您的GET
  6. 您可以点击https://developers.google.com/oauthplayground/

    来查看整个过程

    或者,如果您的客户端应用已经拥有访问令牌,您可以将其与文件ID一起发送到您的服务器,您的服务器可以直接将其设置为授权标头。

    您可以使用PHP库,例如。转到https://developers.google.com/drive/v2/reference/files/insert并向下滚动以查看PHP示例。无论您是手动构建URL还是使用库,都完全可以选择。图书馆的一大缺点是,如果出现问题,你真的需要理解和追踪http,无论如何看看发生了什么,所以不妨从第一天开始学习和爱它们。

    消息“超出未经验证的使用的每日限制”似乎混淆了第一个计时器(包括我)。这是“未经验证的使用”,这是重要的部分,这意味着您尚未设置授权标头。 Google API每天都有未经授权使用的配额(URL缩短器等内容)。在Drive的情况下,该配额是零,因此是错误。

答案 1 :(得分:1)

@pinoyyid说了一切,并且受到他的启发,这是我提出的实际解决方案:

如果您要下载文件,则需要两个变量 - oAuthTokenfileId

当用户进行身份验证时,您将从JS客户端获取oAuthToken。 如果您使用google docs(https://developers.google.com/picker/docs/)中的示例,则该函数如下所示:

function handleAuthResult(authResult) {
    if (authResult && !authResult.error) {
        oauthToken = authResult.access_token;
        oauthToken; // <-- THIS IS THE Bearer token
        createPicker();
        }
}
当用户选择文件时,你会得到{p> fileId。再次,来自谷歌文档的修改示例:

function pickerCallback(data) {
    if (data[google.picker.Response.ACTION] == google.picker.Action.PICKED) {
        var doc = data[google.picker.Response.DOCUMENTS][0];
        alert('You picked fileId: ' + doc[google.picker.Document.ID]);
    }
}

您可能会将这些数据作为表单请求或通过ajax传递。从后端简单的cURL调用下载文件:

$oAuthToken = 'ya29.XXXXXXXXXXXXXXXXXXXXXXXXX-XXXXXXXXX-XXXXXXX-XXXXXX-X-XXXXXXXXXXXX-XXXX';
$fileId = '0B4zzcXXXXXXXXXXXXXXXXXXXXXX';

$getUrl = 'https://www.googleapis.com/drive/v2/files/' . $fileId . '?alt=media';
$authHeader = 'Authorization: Bearer ' . $oAuthToken ;


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $getUrl);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    $authHeader ,
]);

$data = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);

file_put_contents("destination-file.jpg", $data);

关于文件下载的文档:https://developers.google.com/drive/web/manage-downloads

答案 2 :(得分:0)

您将刷新令牌存储在数据库中。检查API调用时,当前令牌是否仍然有效。如果不是,则使用刷新令牌

检索新的访问令牌