0
votes

I have a very generic Google Drive API that allows me to upload files to my Google drive from the browser, but I want to be able to return an array of my files within a chosen folder.

Ive created a picker, and a method .addView(google.picker.ViewId.FOLDERS) which displays all of my Google Drive folders, but it only allows me to select a single file, ie I need to use the Google Drive API to return all files of a folder, not a picker (https://groups.google.com/forum/#!topic/Google-Picker-API/iOak9NsbBpE).

I have this function which achieves the functionality Im looking for:

       function retrieveAllFilesInFolder(folderId, callback) {
          var retrievePageOfChildren = function(request, result) {
            request.execute(function(resp) {
              result = result.concat(resp.items);
              var nextPageToken = resp.nextPageToken;
              if (nextPageToken) {
                request = gapi.client.drive.children.list({
                  'folderId' : folderId,
                  'pageToken': nextPageToken
                });
                retrievePageOfChildren(request, result);
              } else {
                callback(result);
              }
            });
          }
          var initialRequest = gapi.client.drive.children.list({
              'folderId' : folderId
            });
          retrievePageOfChildren(initialRequest, []);
        }

But how do I get it to run in my Google Drive API I already have setup?

 var CLIENT_ID = '1052173400541-ohauk7vubfq0u4tdt4in1bqlbko87ru9.apps.googleusercontent.com';
  var SCOPES = 'https://www.googleapis.com/auth/drive';

  /**
   * Called when the client library is loaded to start the auth flow.
   */
  function handleClientLoad() {
    window.setTimeout(checkAuth, 1);
  }

  /**
   * Check if the current user has authorized the application.
   */
  function checkAuth() {
    gapi.auth.authorize(
        {'client_id': CLIENT_ID, 'scope': SCOPES, 'immediate': true},
        handleAuthResult);
  }

  /**
   * Called when authorization server replies.
   *
   * @param {Object} authResult Authorization result.
   */
  function handleAuthResult(authResult) {
    var authButton = document.getElementById('authorizeButton');
    var filePicker = document.getElementById('filePicker');
    authButton.style.display = 'none';
    filePicker.style.display = 'none';
    if (authResult && !authResult.error) {
      // Access token has been successfully retrieved, requests can be sent to the API.
      filePicker.style.display = 'block';
      filePicker.onchange = uploadFile;
    } else {
      // No access token could be retrieved, show the button to start the authorization flow.
      authButton.style.display = 'block';
      authButton.onclick = function() {
          gapi.auth.authorize(
              {'client_id': CLIENT_ID, 'scope': SCOPES, 'immediate': false},
              handleAuthResult);
      };
    }
  }

  /**
   * Start the file upload.
   *
   * @param {Object} evt Arguments from the file selector.
   */
  function uploadFile(evt) {
    gapi.client.load('drive', 'v2', function() {
      var file = evt.target.files[0];
      insertFile(file);
    });
  }

  /**
   * Insert new file.
   *
   * @param {File} fileData File object to read data from.
   * @param {Function} callback Function to call when the request is complete.
   */
  function insertFile(fileData, callback) {
    const boundary = '-------314159265358979323846';
    const delimiter = "\r\n--" + boundary + "\r\n";
    const close_delim = "\r\n--" + boundary + "--";

    var reader = new FileReader();
    reader.readAsBinaryString(fileData);
    reader.onload = function(e) {
      var contentType = fileData.type || 'application/octet-stream';
      var metadata = {
        'title': fileData.name,
        'mimeType': contentType
      };

      var base64Data = btoa(reader.result);
      var multipartRequestBody =
          delimiter +
          'Content-Type: application/json\r\n\r\n' +
          JSON.stringify(metadata) +
          delimiter +
          'Content-Type: ' + contentType + '\r\n' +
          'Content-Transfer-Encoding: base64\r\n' +
          '\r\n' +
          base64Data +
          close_delim;

      var request = gapi.client.request({
          'path': '/upload/drive/v2/files',
          'method': 'POST',
          'params': {'uploadType': 'multipart'},
          'headers': {
            'Content-Type': 'multipart/mixed; boundary="' + boundary + '"'
          },
          'body': multipartRequestBody});
      if (!callback) {
        callback = function(file) {
          console.log(file)
        };
      }
      request.execute(callback);
    }
  }
1

1 Answers

-1
votes

See the docs of gapi on how to show the intial permission dialog configured with the drive scope. That does the oauth2 flow and gives you an access token which you set in the picker before showing it. once you get the folder id back, call the gapi function you show that lists files. Gapi at that pont will be already authenticated. You already have all the code Except the part where you set scopes and start the auth and permiasion fllow.