Javascript 将文件夹上载到GDrive并获取用于上载文件的文件夹ID

Javascript 将文件夹上载到GDrive并获取用于上载文件的文件夹ID,javascript,google-api,google-drive-api,google-api-js-client,Javascript,Google Api,Google Drive Api,Google Api Js Client,谢谢你阅读我的问题。我正在开发谷歌硬盘api,可以将文件从文本块上传到谷歌硬盘。但是,我需要手动添加文件夹ID,以便用户使用此ID,并且不会出现错误,因为他们正试图将其上载到我的文件夹中。如何创建或获取文件夹ID?甚至可以上载到根GDrive目录?任何提示都会有帮助 谢谢 // Global vars const SCOPE = 'https://www.googleapis.com/auth/drive.file'; const gdResponse = document.querySelec

谢谢你阅读我的问题。我正在开发谷歌硬盘api,可以将文件从文本块上传到谷歌硬盘。但是,我需要手动添加文件夹ID,以便用户使用此ID,并且不会出现错误,因为他们正试图将其上载到我的文件夹中。如何创建或获取文件夹ID?甚至可以上载到根GDrive目录?任何提示都会有帮助

谢谢

// Global vars
const SCOPE = 'https://www.googleapis.com/auth/drive.file';
const gdResponse = document.querySelector('#response');
const login = document.querySelector('#login');
const authStatus = document.querySelector('#auth-status');
const textWrap = document.querySelector('.textWrapper');
const addFolder = document.querySelector('#createFolder');
const uploadBtn = document.querySelector('#uploadFile');

// Save Button and Function
uploadBtn.addEventListener('click', uploadFile);

window.addEventListener('load', () => {
  console.log('Loading init when page loads');
  // Load the API's client and auth2 modules.
  // Call the initClient function after the modules load.
  gapi.load('client:auth2', initClient);
});

function initClient() {
  const discoveryUrl =
    'https://www.googleapis.com/discovery/v1/apis/drive/v3/rest';

  // Initialize the gapi.client object, which app uses to make API requests.
  // Get API key and client ID from API Console.
  // 'scope' field specifies space-delimited list of access scopes.
  gapi.client
    .init({
      apiKey: 'My-API-Key',
      clientId:
        'My-Client-ID',
      discoveryDocs: [discoveryUrl],
      scope: SCOPE,
    })
    .then(function () {
      GoogleAuth = gapi.auth2.getAuthInstance();

      // Listen for sign-in state changes.
      GoogleAuth.isSignedIn.listen(updateSigninStatus);


// Actual upload of the file to GDrive
function uploadFile() {
  let accessToken = gapi.auth.getToken().access_token; // Google Drive API Access Token
  console.log('Upload Blob - Access Token: ' + accessToken);

  let fileContent = document.querySelector('#content').value; // As a sample, upload a text file.
  console.log('File Should Contain : ' + fileContent);
  let file = new Blob([fileContent], { type: 'application/pdf' });
  let metadata = {
    name: 'Background Sync ' + date, // Filename
    mimeType: 'text/plain', // mimeType at Google Drive

    // For Testing Purpose you can change this File ID to a folder in your Google Drive
    parents: ['Manually-entered-Folder-ID'], // Folder ID in Google Drive
     // I'd like to have this automatically filled with a users folder ID
  };

  let form = new FormData();
  form.append(
    'metadata',
    new Blob([JSON.stringify(metadata)], { type: 'application/json' })
  );
  form.append('file', file);

  let xhr = new XMLHttpRequest();
  xhr.open(
    'post',
    'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&fields=id'
  );
  xhr.setRequestHeader('Authorization', 'Bearer ' + accessToken);
  xhr.responseType = 'json';
  xhr.onload = () => {
    console.log(
      'Upload Successful to GDrive: File ID Returned - ' + xhr.response.id
    ); // Retrieve uploaded file ID.
    gdResponse.innerHTML =
      'Uploaded File. File Response ID : ' + xhr.response.id;
  };
  xhr.send(form);
}
我没有包括一些无关的东西。我有类似的东西上传文件夹,它不工作,这并不奇怪

function createFolder() {
  var fileMetadata = {
    name: 'WordQ-Backups',
    mimeType: 'application/vnd.google-apps.folder',
  };
  drive.files.create(
    {
      resource: fileMetadata,
      fields: 'id',
    },
    function (err, file) {
      if (err) {
        // Handle error
        console.error(err);
      } else {
        console.log('Folder Id: ', file.id);
      }
    }
  );
}

我相信你的目标如下

  • 您想将文件上载到根文件夹或创建的新文件夹
对于这一点,下面的修改模式如何

模式1: 如果要将文件放入根文件夹,请尝试以下修改

发件人: 致: 或者,请删除
父项:[“手动输入的文件夹ID]”,
。通过此操作,将文件创建到根文件夹

模式2: 如果要创建新文件夹并将文件放入已创建的文件夹,请尝试以下修改。不幸的是,在您的脚本中,我不确定您的问题中
createFolder()
中的
drive
。因此,我无法理解您的
createFolder()
问题。因此,在此模式中,文件夹是使用
XMLHttpRequest
创建的

修改脚本:
函数createFile(accessToken,folderId){
log('文件应包含:'+文件内容);
让fileContent=document.querySelector('#content').value;
log('文件应包含:'+文件内容);
让file=newblob([fileContent],{type:'application/pdf'});
让元数据={
名称:“背景同步”+日期,
mimeType:'文本/普通',
父母:[folderId],//{
console.log(
“上载成功到GDrive:返回的文件ID-”+xhr.response.ID
);
gdResponse.innerHTML=
'上载的文件.文件响应ID:'+xhr.Response.ID;
};
发送(表格);
}
函数createFolder(accessToken){
const folderName=“样本”//{
const folderId=xhr.response.id;
console.log(folderId);
createFile(accessToken,folderId);
};
send(JSON.stringify(元数据));
}
//首先,运行此函数。
函数uploadFile(){
让accessToken=gapi.auth.getToken().access\u token;
createFolder(accessToken);
}
参考:

正是我想要的。谢谢!@matt谢谢你的回复。我很高兴你的问题得到了解决。没问题,我周末在小屋里,所以很抱歉耽搁了。我不是一个大的堆栈溢出用户,所以如果我没有给你分数或w.e,我道歉。我投票并选择了正确的答案solution@matt非常感谢你或者你的支持!
parents: ['Manually-entered-Folder-ID'],
parents: ['root'],
function createFile(accessToken, folderId) {
  console.log('File Should Contain : ' + fileContent);
  let fileContent = document.querySelector('#content').value;
  console.log('File Should Contain : ' + fileContent);
  let file = new Blob([fileContent], { type: 'application/pdf' });

  let metadata = {
    name: 'Background Sync ' + date,
    mimeType: 'text/plain',
    parents: [folderId], // <--- Modified
  };
  let form = new FormData();
  form.append(
    'metadata',
    new Blob([JSON.stringify(metadata)], { type: 'application/json' })
  );
  form.append('file', file);
  
  let xhr = new XMLHttpRequest();
  xhr.open(
    'post',
    'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&fields=id'
  );
  xhr.setRequestHeader('Authorization', 'Bearer ' + accessToken);
  xhr.responseType = 'json';
  xhr.onload = () => {
    console.log(
      'Upload Successful to GDrive: File ID Returned - ' + xhr.response.id
    );
    gdResponse.innerHTML =
      'Uploaded File. File Response ID : ' + xhr.response.id;
  };
  xhr.send(form);
}

function createFolder(accessToken) {
  const folderName = "sample"; // <--- Please set the folder name.
  
  let metadata = {
    name: folderName,
    mimeType: 'application/vnd.google-apps.folder'
  };
  let xhr = new XMLHttpRequest();
  xhr.open('post', 'https://www.googleapis.com/drive/v3/files?fields=id');
  xhr.setRequestHeader('Authorization', 'Bearer ' + accessToken);
  xhr.setRequestHeader('Content-Type', 'application/json');
  xhr.responseType = 'json';
  xhr.onload = () => {
    const folderId = xhr.response.id;
    console.log(folderId);
    createFile(accessToken, folderId);
  };
  xhr.send(JSON.stringify(metadata));
}

// At first, this function is run.
function uploadFile() {
  let accessToken = gapi.auth.getToken().access_token;
  createFolder(accessToken);
}