Javascript Google Drive api如何使用keeping folder创建文件夹';s结构
我正在尝试创建文件夹到谷歌驱动器。实际上,我正在做的是从我的电脑中取出一个文件夹作为输入,并将其结构插入谷歌硬盘。此外,我试图插入的文件,该文件夹必须谷歌驱动器也,但这个功能是不重要的,现在。首先,我应该在GoogleDrive中创建新的文件夹树。我正在使用驱动器api,在获取输入文件夹后,我解析它们的路径并将它们放入一个数组中。然后根据这些数组管理新文件夹的创建。但我坚持的地方是创建嵌套文件夹。例如,我创建了一个“文档”文件夹,然后尝试在“文档”文件夹中创建一个“文件”文件夹。但是,在创建“文件”文件夹之前,我需要“文档”文件夹的id,以便将其分配为“文件”文件夹的父文件夹。我应该在for循环中一个接一个地创建文件夹。问题是,当我请求“documents”文件夹时,我必须等待request.execute()函数获取其id。在获取id之前,已发送“files”的请求,但它不能将id作为参数,因此我无法创建嵌套文件夹。下面是一个输入文件夹结构的示例,以明确问题。我想在google drive中创建此文件夹结构。这是我的代码Javascript Google Drive api如何使用keeping folder创建文件夹';s结构,javascript,file-upload,google-drive-api,Javascript,File Upload,Google Drive Api,我正在尝试创建文件夹到谷歌驱动器。实际上,我正在做的是从我的电脑中取出一个文件夹作为输入,并将其结构插入谷歌硬盘。此外,我试图插入的文件,该文件夹必须谷歌驱动器也,但这个功能是不重要的,现在。首先,我应该在GoogleDrive中创建新的文件夹树。我正在使用驱动器api,在获取输入文件夹后,我解析它们的路径并将它们放入一个数组中。然后根据这些数组管理新文件夹的创建。但我坚持的地方是创建嵌套文件夹。例如,我创建了一个“文档”文件夹,然后尝试在“文档”文件夹中创建一个“文件”文件夹。但是,在创建“文
<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 the client library is loaded to start the auth flow.
*/
function handleClientLoad() {
window.setTimeout(checkAuth, 1);
}
/**
* Check if the current user has authorized the 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 successfully retrieved, requests can be sent to the API.
filePicker.style.display = 'block';
filePicker.onchange = uploadFile;
} else {
// No access token could be retrieved, show the button to start the authorization flow.
authButton.style.display = 'block';
authButton.onclick = function () {
gapi.auth.authorize(
{ 'client_id': CLIENT_ID, 'scope': SCOPES, 'immediate': false },
handleAuthResult);
};
}
}
/**
* Start the file upload.
*
* @param {Object} evt Arguments from the 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 () {
for (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";
for (var i = 0; i < pathNamesArr.length; i++) {
if (!isFile(pathNamesArr[i]) && searchNames(fileNamesArr, pathNamesArr[i])) {
for (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 to read data from.
* @param {Function} callback Function to call when the request is 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 + " my new id = " + resp.id + "\n";
parentID = resp.id;
fileIdArr.push({ id : resp.id });
});
}
});
}
//Search the names
function searchNames(namesArr, name) {
if (namesArr.length === 0)
return false;
else {
for (var i = 0; i < namesArr.length; i++) {
if (namesArr[i] === name)
return true;
}
return false;
}
}
//Path is file or directory
function isFile(myName) {
for(var i = 0; i < 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>
var客户端ID='xxxxxxxxxxxxxxxxxxxxxxxxxxxx';
var作用域https://www.googleapis.com/auth/drive';
var webviewlink=“”;
var parentID=[{id:“xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”}];
var fileName=“newFolder”;
var fileNamesArr=[];
var fileIdArr=[];
var output=document.getElementById('output');
/**
*在加载客户端库以启动身份验证流时调用。
*/
函数handleClientLoad(){
setTimeout(checkAuth,1);
}
/**
*检查当前用户是否已授权应用程序。
*/
函数checkAuth(){
gapi.auth.authorize(
{'client\u id':client\u id,'scope':SCOPES,'immediate':true},
手工(结果);
}
/**
*当授权服务器答复时调用。
*
*@param{Object}authResult授权结果。
*/
函数handleAuthResult(authResult){
var authButton=document.getElementById('authorizeButton');
var filePicker=document.getElementById('filePicker');
authButton.style.display='none';
filePicker.style.display='none';
if(authResult&!authResult.error){
//已成功检索访问令牌,可以向API发送请求。
filePicker.style.display='block';
filePicker.onchange=上传文件;
}否则{
//无法检索访问令牌,请显示按钮以启动授权流。
authButton.style.display='block';
authButton.onclick=函数(){
gapi.auth.authorize(
{'client\u id':client\u id,'scope':SCOPES,'immediate':false},
手工(结果);
};
}
}
/**
*开始文件上传。
*
*@param{Object}来自文件选择器的evt参数。
*/
函数上传文件(evt){
var files=evt.target.files;//文件列表对象
var totalFiles=files.length;//数组的长度
gapi.client.load('drive','v2',function(){
对于(var k=0;k