javascript - Google Drive api How to create folders with keeping folder's structure -
i trying create folders google drive. doing taking folder computer input , insert structure google drive. trying insert files folder has google drive function not important now. first should create new folder tree inside google drive. using drive api , after taking input folder parse path , put them in array. manage creation of new folders according these arrays. stuck creating nested folders. example create 'documents' folder , try create 'files' folder inside 'documents' folder. before creating 'files' folder need id of 'documents' folder can assign parent 'files' folder. , should creation of folders inside loop 1 after another. problem when make request 'documents' folder have wait request.execute() funtion id. before id request 'files' sent cannot take id parameter cannot create nested folders. here example input folder structure make problem clear.
want create folder structure inside google drive. here code.
<html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <script type="text/javascript"> var client_id = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; var scopes = 'https://www.googleapis.com/auth/drive'; var webviewlink = ""; var parentid = [{ id: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" }]; var filename = "newfolder"; var filenamesarr = []; var fileidarr = []; var output = document.getelementbyid('output'); /** * called when client library loaded start auth flow. */ function handleclientload() { window.settimeout(checkauth, 1); } /** * check if current user has authorized 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 retrieved, requests can sent api. filepicker.style.display = 'block'; filepicker.onchange = uploadfile; } else { // no access token retrieved, show button start authorization flow. authbutton.style.display = 'block'; authbutton.onclick = function () { gapi.auth.authorize( { 'client_id': client_id, 'scope': scopes, 'immediate': false }, handleauthresult); }; } } /** * start file upload. * * @param {object} evt arguments file selector. */ function uploadfile(evt) { var files = evt.target.files; // filelist object var totalfiles = files.length; // length of array gapi.client.load('drive', 'v2', function () { (var k = 0; k < totalfiles; k++) { var file = evt.target.files[k]; var tmp = file.webkitrelativepath; var pathnamesarr = tmp.split('/'); console.debug(file); output.innertext = output.innertext + file.webkitrelativepath + "\n"; (var = 0; < pathnamesarr.length; i++) { if (!isfile(pathnamesarr[i]) && searchnames(filenamesarr, pathnamesarr[i])) { (var t = 0; t < filenamesarr.length; t++) { if (filenamesarr[t] === pathnamesarr[i]) { parentid[0].id = fileidarr[t].id; } } } if (!isfile(pathnamesarr[i]) && !searchnames(filenamesarr, pathnamesarr[i])) { filenamesarr.push(pathnamesarr[i]); createnewfile(pathnamesarr[i], parentid, false); //inserts new folders here } else if (isfile(pathnamesarr[i])) { insertfile(file); } } } }); } /** * insert new file. * * @param {file} filedata file object read data from. * @param {function} callback function call when request 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, 'parents': parentid }; output.innertext = output.innertext + " insert id = " + parentid[0].id + "\n"; 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, }); /* var request = gapi.client.request({ 'path': '/drive/v2/files', 'method': 'post', 'params': { 'uploadtype': 'multipart' }, 'body': { "title": "cat", "mimetype": "application/vnd.google-apps.folder", "description": "some" } });*/ if (!callback) { callback = function (file) { console.log(file) }; } request.execute(callback); } } //extra part function createnewfile(filename, parentfileid, ispublic) { output.innertext = output.innertext + " girdi createnewfile2" + filename + " " + parentfileid[0].id + "\n"; gapi.client.load('drive', 'v2', function () { output.innertext = output.innertext + " girdi gapi" + "\n"; var request = gapi.client.request({ 'path': '/drive/v2/files', 'method': 'post', 'body': { "title": filename, "mimetype": "application/vnd.google-apps.folder", "description": "some", "parents": parentfileid } }); if (ispublic) { request.execute(function (resp) { console.log(resp); parentid = resp.id; fileidarr.push({ id : resp.id }); var permissionbody = { 'value': '', 'type': 'anyone', 'role': 'reader' }; var permissionrequest = gapi.client.drive.permissions.insert({ 'fileid': resp.id, 'resource': permissionbody }); permissionrequest.execute(function (resp) { }); }); } else { request.execute(function (resp) { console.log(resp); output.innertext = output.innertext + " new id = " + resp.id + "\n"; parentid = resp.id; fileidarr.push({ id : resp.id }); }); } }); } //search names function searchnames(namesarr, name) { if (namesarr.length === 0) return false; else { (var = 0; < namesarr.length; i++) { if (namesarr[i] === name) return true; } return false; } } //path file or directory function isfile(myname) { for(var = 0; < myname.length; i++){ if (myname.indexof(".txt") > -1) return true; } return false; } </script> <script type="text/javascript" src="https://apis.google.com/js/client.js?onload=handleclientload"></script> </head> <body> <div> <input type="file" id="filepicker" multiple directory webkitdirectory mozdirectory /> <input type="button" id="authorizebutton" style="display: none" value="authorize" /> </div> <div id="output"></div>
Comments
Post a Comment