user6875444
user6875444

Reputation: 41

How can I download a file by name from Google Drive API?

I am trying to download a file from Google Drive API v3. I have to do this by finding a file by name.

This is request url to get a file general information:

https://www.googleapis.com/drive/v3/files?q=name+%3D+'fileName.json'

and to download a file I have to use parameter alt=media. It works but only when I am finding this file by id. I mean:

https://www.googleapis.com/drive/v3/files/3Gp-A4t6455kGGGIGX_gg63454354YD?alt=media

Anyone know how to download a file by name so using this?

https://www.googleapis.com/drive/v3/files?q=name+%3D+'fileName.json'

Upvotes: 4

Views: 8589

Answers (1)

Rafa Guillermo
Rafa Guillermo

Reputation: 15377

Answer:

Unfortunately it isn't possible to download a file from Google Drive using the file name in the URL itself.

Reasoning:

As can be seen in the image below, Google Drive supports multiple files having the same name. Each file, instead of being identified exclusively by its name, has a unique ID which tells it apart from other files. As it is possible to have, for example, three files all with the same name, making a request and only referring to the file name doesn't give enough information to identify exactly which file you want to download.

enter image description here

Workaround:

You can still use the filename to build the request, but first you need to make a list request to the Drive API so that you can obtain the specific file ID for the file you wish to download.

I'll assume the file you want to download is called fileName.json as in your question.

First, you'll want to make a list request to the server to obtain the initial file name. The scope you will need for this is:

https://www.googleapis.com/auth/drive.readonly

The request itself is as you placed in the question. Once you have obtained your token, you must make a GET request:

GET https://www.googleapis.com/drive/v3/files?q=name+%3D+'fileName.json'&key=[YOUR API KEY]

You must replace [YOUR API KEY] with your actual API key here. You can obtain a temporary one over at the OAuth Playground.

From this request you will get a JSON reponse of all the files in your Drive with the requested filename. This is an important point - if you only have one file with this filename, you have nothing to worry about and can continue from here. If more than one file exists then the JSON response will contain all these files and so extra code will need to be added here to retrieve the one you want.

Continuing on - the response you get back is of the following form:

{
  "incompleteSearch": false, 
  "files": [
    {
      "mimeType": "application/json", 
      "kind": "drive#file", 
      "id": "<your-file-ID>", 
      "name": "fileName.json"
    }
  ], 
  "kind": "drive#fileList"
}

From here, you can start to build your URL.

Building the download URL:

After retrieving the JSON response from the API, you need to extract the File ID to put into a URL. The following example is written in JavaScript/Google Apps Script, but can be built in whichever language suits your needs:

function buildTheUrl() {
  var url = "https://www.googleapis.com/drive/v3/files";
  var fileName = "fileName.json"
  var apiKey = "your-api-key";
  var parameters = "?q=name+%3D+'";

  var requestUrl = url + parameters + fileName + "&key=" + apiKey;
  var response = JSON.parse(UrlFetchApp.fetch(requestUrl).getContentText());

  var fileId = response.files.id;
  var downloadUrl = "https://www.googleapis.com/drive/v3/files/";
  var urlParams = "?alt=media";

  return downloadUrl + fileId + urlParams + "&key=" + apiKey;
}

This returns a string which is the download URL for the file. This is a Files: get request that can then be used to download the file in question.

References:

Upvotes: 8

Related Questions