3

我正在 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

发现了一个与此类似的问题,但没有回答如何在从 google picker 选择文件后立即在后端下载文件中下载文件。

4

1 回答 1

0

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

    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);
    };
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

于 2015-07-14T07:38:11.817 回答