'How to upload a file into a specific location in the Google Drive using the JS API?

I'm using googleapis to upload different files to the Google Drive. The scenario is:

  1. User provides a document and it's information through my REST API (I'm using NodeJS).
  2. The REST API creates the directory that will contain the document, if it's not already exist.
  3. The REST API uploads the document to that directory.

The structure of the drive is:

/root/documents/$type/$new_document

where $type is one of the user's provided fields and the $new_document is the document that was provided by the user.

The way I connect:

oauth2Client.setCredentials({ refresh_token: REFRESH_TOKEN });
drive_instance = google.drive({
  version: 'v3',
  auth: oauth2Client,
});

I figured how to upload the document to root folder of the Google Drive:

}
try {
    const response = await drive.files.create({
      requestBody: {
        name: file.name,
        mimeType: file.mimetype,
      },
      media: {
        mimeType: file.mimetype,
        body: file.data,
      },
    });

    console.log(response.data);
} catch (error) {
    console.log(error.message);
}

What I'm struggling is:

  1. How to create the directory /root/documents/$type if it's not already existing?
  2. How to upload the $new_document to /root/documents/$type?

For the second question, I know that the docs provide an option of parents[] that will contain all the folder IDs. but then, how can I get the folder ID of /root/documents/$type? Is there someway to combine the steps (like maybe mkdir -p for the directories or creating the directory will return the ID of the directory).



Solution 1:[1]

1. Try found folder you need via drive.files.list() method

You need set filter. Example:

add 'q': "..." in requestBody to search what you need

use "name = 'Some Folder Name'" to search by name

use "mimeType = 'application/vnd.google-apps.folder'" to search only folders

Thus, combine via and:

'q': "name = 'Some Folder Name' and mimeType = 'application/vnd.google-apps.folder'" to find all folders with name you chose

const folderName = 'Some Folder Name'


gapi.client.drive.files
                .list({
                    'q': "name = 'Some Folder Name' and mimeType = 'application/vnd.google-apps.folder'",
                    'pageSize': 1000,
                    'fields': "files(id, name, parents)"
                })
                .then((response) => {

                    const files = response.result.files;
                    if (files.length > 0) {
                      handleSearchResult(files)
                    } else {
                      createFolder()
                    }
                    console.log(total / (1024*1024*1024))
                });

About handleSearchResult() or createFolder:

  • It maybe more than 1 file. So you can find necessary root getting files[i].parents . That's why I added parents in 'fields': "files(id, name, parents)". https://developers.google.com/drive/api/v3/reference/files
  • Also you can add searching rule e.g. 'parents contain "..."'' https://developers.google.com/drive/api/v3/search-files
  • If search brings 0 files result so just create folder by yourself. You can create path\directory step-by step. Create first folder in drive root and remember id. After that create second folder and add in requestBody parentId that equal first folder id. And etc... Btw you can use almost the same logic to search.

2. Create folder if its necessary

Example:

// name = 'Folder Name', 
// parents = ['some-parent1-id', 'some-parent2-id', ...]
function createFolder(name, parents) {
            const fileMetadata = {
                'name' : name,
                'mimeType' : 'application/vnd.google-apps.folder',
                'parents': parents
            };
            gapi.client.drive.files
                .create({
                    resource: fileMetadata,
                }).then((response) => {
                    switch(response.status){
                        case 200:
                            const file = response.result;

                            console.log('Created Folder Id: ' + file.id);
                            break;
                        default:
                            console.log('Error creating the folder, '+response);
                            break;
                    }
                });
        }

3. Upload file with setted parents

you should add parents = ['id-of-folder'] in requestBody

Read more in Google Drive API - Files: create

I hope it will help at least a bit:) Keep it up!

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Vlad Krutenyuk