4

Right now I'm using this code to upload files to Google Drive: https://stackoverflow.com/a/11657773/1715263 It works fine with a textfile.

With the same code I'm trying to create a folder, using this information from Google: https://developers.google.com/drive/folder

so Google says "Content-Type: application/json" goes into the header and "application/vnd.google-apps.folder" should be the mimetype in the body(?), thats what I'm doing in my code, which looks like this now:

function createFolder() 
{
    var access_token = googleAuth.getAccessToken();

    var json = JSON.stringify({
        mimeType: 'application/vnd.google-apps.folder',
        title: 'Folder',
    });

    var body =  "Content-Type: application/json" + "\r\n" +
                "Content-Length: " + json.length + "\r\n" + "\r\n" +
                json;

    gapi.client.request({

        'path': '/upload/drive/v2/files/',
        'method': 'POST',
        'params': {'uploadType': 'multipart'},
        'headers': {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer ' + access_token,             
        },
        'body': body
    }).execute(function(file) { 
        document.getElementById("info").innerHTML = "Created folder: " + file;
    }); 

But it's only creating a file named "Untitled", it's no folder and you can't open it.

When I change the "Content-Type" in the "headers" section to "application/vnd.google-apps.folder" and remove the "body" part, it's creating a folder named "Untitled".

How can I get it to create a folder with a specific title?

2 Answers 2

7

Finally got it working by googling Claudios code which led me to this piece of code: https://stackoverflow.com/a/11361392/1715263

The important thing that changed is the 'path', its now "/drive/v2/files/" instead of "/upload/drive/v2/files/". I just removed the 'gapi.client.load'-function, added headers information and changed the bodys mimeType.

So here's the code:

function createFolder() {

   var access_token = googleAuth.getAccessToken();

   var request = gapi.client.request({
       'path': '/drive/v2/files/',
       'method': 'POST',
       'headers': {
           'Content-Type': 'application/json',
           'Authorization': 'Bearer ' + access_token,             
       },
       'body':{
           "title" : "Folder",
           "mimeType" : "application/vnd.google-apps.folder",
       }
   });

   request.execute(function(resp) { 
       console.log(resp); 
       document.getElementById("info").innerHTML = "Created folder: " + resp.title;
   });
}
Sign up to request clarification or add additional context in comments.

4 Comments

Is the only way to check if the file already exists is to perform a search? Or is it also possible to pass a unique ID yourself for example?
when you create a folder or upload a file you can access its unique ID in the "request.execute" callback function via "resp.id" (in my code example). you can then save that ID somewhere and access its related file like shown here stackoverflow.com/a/14431112/1715263 finally, just add some error handling: if (!resp.error) {console.log("File already exists: " + resp.title);} else {console.log("File not found: " + resp.error.message);
Thanks a lot. I think your answer will help other users indeed. However, Google Drive is my only storage so unfortunately I cannot save the id. I only know the filename itself. So I guess I am stuck with searching.
I see. The only solution I can think of is giving your file a unique filename by adding some random characters and then searching for it, its not that different from accessing a file by its ID, since its all indexed somehow anyways. Another way would be using the 'Application Data folder', thats a special folder that is only accessible by your application, so you can make sure there is no duplicate of your file: developers.google.com/drive/appdata
4

Try the following code:

function createFolder(folderName) {
  var body = {
    'title': folderName,
    'mimeType': "application/vnd.google-apps.folder"
  };

  var request = gapi.client.drive.files.insert({
    'resource': body
  });

  request.execute(function(resp) {
    console.log('Folder ID: ' + resp.id);
  });
}

2 Comments

Hey! Thank you for the fast reply :) When I tried your code I got error "Uncaught TypeError: Cannot read property 'files' of undefined" Then I googled your code and found this: stackoverflow.com/a/11361392/1715263 which helped me to finally get it working :)
'name' instead of 'title', at least for drive v2

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.