【问题标题】:Download file right after picked file from google picker从谷歌选择器选择文件后立即下载文件
【发布时间】:2017-11-19 19:15:38
【问题描述】:

我只是尝试实现 Google Drive Picker API,以便下载用户通过 Google Drive Picker 提交的文件(在后台)。

我使用了 Google 选择器,它运行良好,但是我无法下载该文件。 (先从单个文件开始)。

这是我的代码,在我的梦想中,我可以在获得选择器的文件后立即下载文件。

function createPicker() {
            if (pickerApiLoaded && oauthToken) {
            var picker = new google.picker.PickerBuilder().
                    addView(google.picker.ViewId.DOCS).
                    addView(google.picker.ViewId.PHOTOS).
                    addView(google.picker.ViewId.FOLDERS).
                    enableFeature(google.picker.Feature.MULTISELECT_ENABLED).
                    setOAuthToken(oauthToken).
                    setDeveloperKey(developerKey).
                    setCallback(pickerCallback).
                    build();
            picker.setVisible(true);
        }
    }

    // A simple callback implementation.
    function pickerCallback(data) {
        var url = 'nothing';
        if (data[google.picker.Response.ACTION] == google.picker.Action.PICKED) {
            var fileId = data.docs[0].id;
            var fileUrl = data.docs[0].url;
            alert('The user selected: ' + fileId);
            console.log(data.docs);
        }
        var message = 'You picked: ' + url;
        document.getElementById('result').innerHTML = message;
    }

请注意,我想下载照片,但我无权访问“downloadUrl”字段。 Google Drive Picker 和 Drive API 在我的应用中处于“开启”状态。

一切正常,只是我无法下载检索文件。

【问题讨论】:

    标签: google-drive-api google-picker


    【解决方案1】:

    您需要使用文件 ID 获取文件的下载 URL。完成后,您可以使用 AJAX 调用该 URL 来获取文件数据。或者,您可以将文件字节作为表单数据中的 blob 发送到服务器端。

    var googleSelectedFiles = new Array();
    
    if (data[google.picker.Response.ACTION] == google.picker.Action.PICKED) {
    
        var docs = data[google.picker.Response.DOCUMENTS];
        docs.forEach(function (file) {
    
            var downloadUrl;
    
            gapi.client.request({
                'path': '/drive/v2/files/' + file.id,
                'method': 'GET',
                callback: function (responsejs, responsetxt) {
    
                    downloadUrl = responsejs.downloadUrl;
    
                    var gDoxBlob = null;
                    var xhr = new XMLHttpRequest();
                    xhr.open("GET", downloadUrl); //file.url
    
                    var accessToken = gapi.auth.getToken().access_token;
                    xhr.setRequestHeader('Authorization', 'Bearer ' + accessToken);
    
                    xhr.responseType = "blob";
                    xhr.onload = function () {
    
                        gDoxBlob = xhr.response;
                        googleSelectedFiles.push({ bytes: gDoxBlob, name: file.name });
                    }
                    xhr.send();
    
                }
            });
    
        });
    
    }
    

    【讨论】:

      【解决方案2】:

      我希望你能够查看文件选择器并且你现在想要下载选定的文件,下面的代码能够做到这一点:

      首先修改您的 createPicker 回调:

      function pickerCallback(data) {
              var url = 'nothing';
              if (data[google.picker.Response.ACTION] == google.picker.Action.PICKED) {
                  var fileId = data.docs[0].id;
                  getDownloadurl(fileId);    //this is the custom function
      
              }       
          }
      

      然后实现getDownloadUrl

      function getDownloadUrl(fileId) {
                  /*Before executing following client request you must include
                      <script type="text/javascript" src="https://apis.google.com/js/client.js"></script>
                  google client library*/
      
                  var request =
                      gapi.client.request({
                          'path': '/drive/v2/files/' + fileId,
                          'params': { 'maxResults': '1000' },
                          callback: function (responsejs, responsetxt) {
                                  var fileDownloadUrl = responsejs.downloadUrl; //using this downloadUrl you will be able to download Drive File Successfully
                          }
                      });
              }
      

      【讨论】:

      • 获取文件下载url后,后端需要做什么才能获取文件?
      • 不能这么简单地使用downloadUrl来下载文件。您应该使用 downloadUrl 下载文件并将访问令牌再次发送到 api,但我不知道该怎么做,我也在寻找答案。
      猜你喜欢
      • 1970-01-01
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多