Google 驱动器 API - 从 id 获取文件夹名称

Google drive API - Getting name of folder from id

我正在使用 nodejs 制作一个应用程序,我需要从 Google 驱动器上的文件夹下载文件。这是我用于下载给定文件夹 link 中的文件的代码。 folderId 是从 google 驱动器获得的共享 link 的 ID。

function DlImgFromFolder(auth, folderId, folderName) {
  const drive = google.drive({version: 'v3', auth});
  var query = "'" + folderId + "' in parents and mimeType contains 'image/' and trashed = false";
  drive.files.list({
    q: query,
    fields: 'files(id, name)',
  }, function(error, response) {
    if (error) { return console.log("ERROR", error); }
  
    response.data.files.forEach(function(item) {
      var file = fs.createWriteStream("./" +folderName+ '/'+ item.name);
      file.on("finish", function() {
        console.log("downloaded", item.name);
      });
  
      // Download file
      const drive = google.drive({version: 'v3', auth});
      drive.files.get({
            fileId: item.id,
            alt: 'media'
        }, {
            responseType: 'stream'
        },function(err, response){
            if(err)return '';
            
            response.data.on('error', err => {
                
            }).on('end', ()=>{
                
            })
            .pipe(file);
       });
      


    });
  });
}

到目前为止,我是手动指定文件夹名称,但我想根据文件夹的原始名称自动命名。我已阅读 api 文档并在 google 上进行了搜索,但找不到任何相关信息。有没有办法根据提供下载的url/id得到文件夹的名字?

我注意到您正在使用:

files.list

你只能用它来获取 parents 信息,除非你在查询中使用它,所以你只能找到文件夹,并且会包含 folder 的名称:

mimeType='application/vnd.google-apps.folder'

您可以测试它并查看上面的文档,对于字段只需添加“*”。

响应中的每个文件资源都有一个 属性 parents,它是文件所在文件夹的 ID。您可以将此文件夹 ID 与 files.get 请求一起使用,以检查它是否是您要查找的文件夹,您可以对其进行测试 here。您可以将“名称”放在“字段”参数中。

在你的脚本中,做如下修改怎么样?

修改后的脚本:

async function DlImgFromFolder(auth, folderId) {
  const drive = google.drive({ version: "v3", auth });
  const res = await drive.files
    .get({ fileId: folderId })
    .catch((err) => console.log(err.errors));
  if (!res) return;
  const folderName = res.data.name;

  var query =
    "'" +
    folderId +
    "' in parents and mimeType contains 'image/' and trashed = false";
  drive.files.list(
    {
      q: query,
      fields: "files(id, name)",
    },
    function (error, response) {
      if (error) {
        return console.log("ERROR", error);
      }

      response.data.files.forEach(function (item) {
        var file = fs.createWriteStream("./" + folderName + "/" + item.name);
        file.on("finish", function () {
          console.log("downloaded", item.name);
        });

        // Download file
        drive.files.get(
          {
            fileId: item.id,
            alt: "media",
          },
          {
            responseType: "stream",
          },
          function (err, response) {
            if (err) return "";

            response.data
              .on("error", (err) => {})
              .on("end", () => {})
              .pipe(file);
          }
        );
      });
    }
  );
}
  • 在此修改中,使用“Files:get”方法从输入的文件夹 ID 中检索文件夹名称。

注:

  • 在这种情况下,当您的本地PC没有folderName的文件夹时,就会出现错误。请注意这一点。

参考: