How to use Google Drive API to download files with Javascript

前端 未结 4 901
耶瑟儿~
耶瑟儿~ 2020-12-30 11:38

I want to download files from google drive with javascript API. I have managed to authenticate and load list of files using gapi.client.drive.files request. How

相关标签:
4条回答
  • 2020-12-30 11:55

    Phu, you were so close!

    Thank you for sharing your method of using the webContentLink and webViewLink. I think that is best for most purposes. But in my app, I couldn't use viewContentLink because need to be able to enter the image into a canvas, and the image google provides is not CORS ready.

    So here is a method

    var fileId = '<your file id>';
    var accessToken = gapi.auth2.getAuthInstance().currentUser.get().getAuthResponse().access_token;// or this: gapi.auth.getToken().access_token;
    var xhr = new XMLHttpRequest();
    xhr.open("GET", "https://www.googleapis.com/drive/v3/files/"+fileId+'?alt=media', true);
    xhr.setRequestHeader('Authorization','Bearer '+accessToken);
    xhr.responseType = 'arraybuffer'
    xhr.onload = function(){
        //base64ArrayBuffer from https://gist.github.com/jonleighton/958841
        var base64 = 'data:image/png;base64,' + base64ArrayBuffer(xhr.response);
    
        //do something with the base64 image here
    
    }
    xhr.send();

    Notice that I set the response type to arraybuffer, and moved alt=media up to the xhr.open call. Also I grabbed a function that converts the array buffer to base64 from https://gist.github.com/jonleighton/958841.

    0 讨论(0)
  • 2020-12-30 11:59

    Task: download the file and create File object; Environment: browser;

    const URL = 'https://www.googleapis.com/drive/v3/files';
    const FIELDS = 'name, mimeType, modifiedTime';
    
    const getFile = async (fileId) => {
      const { gapi: { auth, client: { drive: { files } } } } = window;
      const { access_token: accessToken } = auth.getToken();
      const fetchOptions = { headers: { Authorization: `Bearer ${accessToken}` } };
      
      const {
        result: { name, mimeType, modifiedTime }
      } = await files.get({ fileId, fields: FIELDS });
      
      const blob = await fetch(`${URL}/${fileId}?alt=media`, fetchOptions).then(res => res.blob());
      const fileOptions = {
        type: mimeType,
        lastModified: new Date(modifiedTime).getTime(),
      };
      
      return new File([blob], name, fileOptions);
    };

    0 讨论(0)
  • 2020-12-30 12:13

    Based from this documentation, if you're using alt=media, you need to make an authorized HTTP GET request to the file's resource URL and include the query parameter alt=media.

    GET https://www.googleapis.com/drive/v3/files/0B9jNhSvVjoIVM3dKcGRKRmVIOVU?alt=media
    Authorization: Bearer ya29.AHESVbXTUv5mHMo3RYfmS1YJonjzzdTOFZwvyOAUVhrs
    

    Check here the examples of performing a file download with our Drive API client libraries.

    String fileId = "0BwwA4oUTeiV1UVNwOHItT0xfa2M";
    OutputStream outputStream = new ByteArrayOutputStream();
    driveService.files().get(fileId)
            .executeMediaAndDownloadTo(outputStream);
    

    For the error (403) Insufficient Permission, maybe this is a problem with your access token, not with your project configuration.

    The insufficient permissions error is returned when you have not requested the scopes you need when you retrieved your access token. You can check which scopes you have requested by passing your access_token to this endpoint: https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=ACCESS_TOKEN

    Check these links:

    • google plus api: "insufficientPermissions" error

    • Google drive Upload returns - (403) Insufficient Permission

      Remember you are uploading to the service accounts google drive account. If you want to be able to see it from your own Google drive account you are going to have to do an insert of the permissions. to give yourself access

    0 讨论(0)
  • 2020-12-30 12:17

    I found out that I can actually retrieve URLs of all those files from the folder using files'
    webViewLink or webViewContent attributes. A file which is of Google Drive type (Google Doc, Google Sheet, etc...) will have webViewLink attribute and a non Google Drive type file will have webContentLink. The webViewLink will open the file in Google Drive and the webContentLink will download the file. My code:

    var request = gapi.client.drive.files.list({
        q:"'0Bz9_vPIAWUcSWWo0UHptQ005cnM' in parents", //folder ID
        fields: "files(id, name, webContentLink, webViewLink)"
    });
    request.execute(function(resp) {
        console.log(resp); //access to files in this variable
    }
    
    0 讨论(0)
提交回复
热议问题