【问题标题】:Google picker and backend file download谷歌选择器和后端文件下载
【发布时间】:2013-11-04 17:51:09
【问题描述】:

我在我的网络应用程序中使用谷歌选择器来允许用户从他的谷歌驱动器中浏览和选择文件。一旦他做出选择,选择器就会返回有关所选文件的各种数据,包括文件 ID 和 URL。我的目标是将选定的文件下载到服务器。如果我将 URL 传递给我的后端脚本,它将无法下载私有文件。我知道我可能可以使用提供的文件 ID 通过 Drive API 访问文件,但我需要一个访问令牌,所以我需要让用户使用 oauth 流授予我权限。我不想那样做。如果用户使用谷歌选择器选择了一个文件,他就隐含地授予我的应用访问该文件的权限。为什么我无法获得无需令牌即可访问的公共下载 URL?我相信这就是 Dropbox 选择器的工作原理。

我在这里遗漏了什么吗?有没有办法在通过 oauth 身份验证的情况下实现我想要做的事情。所以,基本上我需要的是这样的:

  1. 用户使用选择器选择文件
  2. Picker 提供公共下载 URL(临时 URL 可以)
  3. 我将该 URL 传递给我的后端脚本,然后它会下载文件

或者,我可以使用这样的解决方案:

  1. 用户使用选择器选择文件
  2. Picker 提供文件 ID oauth 访问令牌
  3. 我将文件 ID 和令牌传递给我的后端脚本,然后它可以使用提供的访问令牌访问 Google Drive API 并下载文件。

【问题讨论】:

  • 你能在这方面取得进展吗?发布示例代码可能对其他人有帮助。
  • 哈哈,我也遇到过这个问题:)

标签: google-drive-api google-picker


【解决方案1】:

终于找到了解决办法。

如果要下载文件,则需要两个变量 - 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();
        }
}

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($url);

curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

curl_setopt($ch, CURLOPT_HTTPHEADER, [$authHeader]);

$data = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_errno($ch);


$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 其实,什么都给了我们,但我们动不动脑筋去弄出真正的代码:)

【讨论】:

  • 您能否解决我的问题,以使用 php 和 javascript 将用户选择的文件下载到我的服务器。我正在关注以下链接,但它不起作用。它不会以正确的格式下载它。链接:stackoverflow.com/questions/23423671/…
  • Martin 它正在保存 1 个字节的文件,其中没有任何内容。当我打开它时,它显示非常短的文件(没有内容),我无法理解的问题是什么。请帮助解决我的问题。
  • @user3653474 检查 curl 是否正确执行,检查是否不存在错误(转储 $error 变量)
  • string(379)" { "error"; { "errors":[{ "domain":"usageLimits","re​​ason":dailyLimitExceededUnreg", 消息:未验证使用的每日限制已超过。继续使用需要注册。". "extendedHelp":"code.google.com/apisconsole" }], "code":403, "message":"未验证使用的每日限制已超过。继续使用需要注册。"}}"
  • @user3653474 尝试使用 PHP 下载文件,而不是使用 javascript。尝试使用我的示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多