【问题标题】:How to download a file that I have chosen from Google Picker API?如何下载我从 Google Picker API 中选择的文件?
【发布时间】:2015-07-14 15:38:11
【问题描述】:

我正在一个 PHP 站点中实现 Google Picker。我可以从 Google Picker API 获取文件 ID,也可以使用 JavaScript 下载文件。以下是我在 setCallback(pickerCallback) 函数中调用的回调函数。

function pickerCallback(data) {
    if (data.action == google.picker.Action.PICKED) {
      var fileId = data.docs[0].id;
      document.getElementById('googleFileId').value = fileId;
      var name = data.docs[0].name;
      var url = data.docs[0].url;
      var accessToken = gapi.auth.getToken().access_token;
      var request = new XMLHttpRequest();
      request.open('GET', 'https://www.googleapis.com/drive/v2/files/' + fileId);
      request.setRequestHeader('Authorization', 'Bearer ' + accessToken);
      request.addEventListener('load', function() {
          var item = JSON.parse(request.responseText);
          window.open(item.webContentLink,"_self"); //Download file in Client Side 
      });
      request.send();
    }
    var message = 'File ID of choosen file : ' + fileId;
    document.getElementById('result').innerHTML = message;
}

我可以将文件 ID 传递给 PHP,但要下载文件,我必须再次进行身份验证。任何人都可以帮助如何在 PHP 中进行文件下载吗?

Google Developers 页面中有一个管理下载帮助,但它不适用于我https://developers.google.com/drive/web/manage-downloads

发现了一个和这个类似的问题,但是没有答案如何在后端Download file right after picked file from google picker下载文件。

【问题讨论】:

  • 如果你有文件ID,为什么不能使用files.get 获取downloadUrl 并使用它来下载文件?
  • 当我使用 files.get 它返回一个 404 文件未找到,因为我认为我必须再次进行身份验证才能访问文件信息(即获取 downloadUrl)。要进行身份验证,我必须创建 authurl 并要求用户进行身份验证对吗?这使得通过 Google Picker 进行两次身份验证,另一个进行下载。有没有其他办法?
  • 如果您收到 404 错误,我认为您没有访问该文件的适当权限。检查以确保您这样做。
  • 你能举个例子,告诉我如何用 PHP 下载文件吗?因为我完全不知道该怎么做。您能否提供在从 Google Picker 获取 fileId 之后以及在 PHP 中获取文件元数据之前要遵循的步骤,如files.get 中给出的那样。我正在尝试在 localhost 中实现这一点,这会是一个问题吗? @安迪

标签: javascript php google-picker


【解决方案1】:

您必须为选择操作实现回调。看看我的实现:

    var buildPicker = function(parentId) {

      var pickerCallback = function(data) {
        if (data[google.picker.Response.ACTION] === google.picker.Action.PICKED && data.viewToken[0] !== 'upload') {
          var docs = data[google.picker.Response.DOCUMENTS];
          for (var d = 0; d < docs.length; d++) {
            downloadFile(docs[d].id);
          }
        }
      };

      GAuth.getToken().then(function(token) {
        var picker = new $window.google.picker.PickerBuilder()
          .addView(new google.picker.DocsUploadView().setParent(parentId))
          .addView(new google.picker.DocsView().setParent(parentId).setIncludeFolders(true))
          .setDeveloperKey(apiKey)
          .setOAuthToken(token.access_token)
          .setCallback(pickerCallback);

        picker.enableFeature(google.picker.Feature.MULTISELECT_ENABLED);
        picker.build().setVisible(true);
      });



    };

    var downloadFile = function(fileId) {

      getFile(fileId).then(function(file) {
        var downloadUrl;
        if (angular.isDefined(file.exportLinks)) {
          downloadUrl = file.exportLinks['application/pdf'];
        } else {
          downloadUrl = file.webContentLink;
        }
        var $idown;
        var makeiFrame = function(url) {
          if ($idown) {
            $idown.attr('src', url);
          } else {
            $idown = $('<iframe>', {
              id: 'idown',
              src: url
            }).hide().appendTo('body');
          }
        };
        makeiFrame(downloadUrl);
      });
    };


     // Implemented with https://github.com/maximepvrt/angular-google-gapi. But any other implementation will be fine as well
    var getFile = function(fileId) {
      var parameters = {
        'fileId': fileId
      };
      return GApi.executeAuth('drive', 'files.get', parameters);
    };
&lt;script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"&gt;&lt;/script&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 2017-11-08
    • 2015-11-03
    相关资源
    最近更新 更多