javascript - 如何找到 Google 云端硬盘文件的整个父文件夹层次结构?

标签 javascript node.js google-drive-api

我可以使用 Google Drive API 来执行此操作:

drive.files.get(
  {
    fields: "parents",
    fileId: "######"
  },
  (err, results) => {
    ...
  }
);

但是,我只能获取文件夹的 ID,比文件高一级。

如何获取包含 Google 云端硬盘文件的父文件夹、包含该文件夹的文件夹、包含该文件夹的文件夹等的整个层次结构?

最佳答案

这个方法怎么样?我认为您的情况有几种解决方案。因此,请将此视为其中之一。遗憾的是,无法使用 Drive API 的 files.get 检索文件夹中的所有文件夹(包括子文件夹)。当 q 用于 Drive API 的 files.list 时,'folder ID' in parents 仅检索文件夹 ID 中的文件夹。无法检索文件夹 ID 中子文件夹下的文件夹。所以在这个方法中,我使用了下面的流程。

  1. 检索 Google 云端硬盘中的所有文件夹。
    • 在此示例脚本中,如果您的 Google Drive 中的文件夹数量少于 1000,则所有文件夹都将通过一次 API 调用检索。如果文件夹数量为 1000 到 2000,则使用 2 次 API 调用。
  2. 使用所有文件夹的列表创建文件夹树。

示例脚本:

function run(auth) {
    var drive = google.drive({version: 'v3', auth: auth});
    getFolderTree(drive, "", []);
}

function getFolderTree(drive, nextPageToken, folderList) {
    drive.files.list({
        pageToken: nextPageToken ? nextPageToken : "",
        pageSize: 1000,
        q: "mimeType='application/vnd.google-apps.folder'",
        fields: "files(id,parents),nextPageToken",
    }, (err, {data}) => {
        if (err) return console.log('The API returned an error: ' + err);
        const token = data.nextPageToken;
        Array.prototype.push.apply(folderList, data.files);
        if (token) {
            getFolderTree(drive, token, folderList);
        } else {

            // This script retrieves all folders including subfolders under this folder ID.
            const folderId = "### Top folder ID ###";

            const folderTree = function c(folder, folderSt, res) {
                let ar = folderList.filter(e => e.parents[0] == folder);
                folderSt += folder + "#_aabbccddee_#";
                let arrayFolderSt = folderSt.split("#_aabbccddee_#");
                arrayFolderSt.pop();
                res.push(arrayFolderSt);
                ar.length == 0 && (folderSt = "");
                ar.forEach(e => c(e.id, folderSt, res));
                return res;
            }(folderId, "", []);

            // Output the folder tree.
            console.log(folderTree);
        }
    });
}

输出:

当文件夹结构如下。 (您可以在此示例脚本中设置顶级文件夹 ID。)

enter image description here

此脚本创建一个数组,如下所示。

[
  ['topFolderId'],
  ['topFolderId','folderId_2a'],
  ['topFolderId','folderId_2b'],
  ['topFolderId','folderId_2b','folderId_3a'],
  ['topFolderId','folderId_2b','folderId_3b']
]

注意事项:

  • 我确认此示例脚本适用于 v30.0.0 的 googleapis。
  • 通常,文件夹树是通过从顶级文件夹中按顺序检索文件夹来创建的。但是对于这种情况使用Drive API时,如果top folder中的文件夹很多,需要调用很多API。因此,在这种方法中,我尝试使用所有文件夹的列表通过少量 API 调用创建文件夹树。
  • 这是一个简单的示例脚本,因此请根据您的环境修改它。

引用:

编辑:

此更新后的脚本会检索整个文件夹树,包括输入的文件夹 ID。对于上述脚本,修改了 run()getFolderTree()

function run(auth) {
    var drive = google.drive({version: 'v3', auth: auth});
    drive.files.get({fileId: "root", fields: "id"}, (err, {data}) => {
      getFolderTree(drive, "", [], data.id);
    });
}

function getFolderTree(drive, nextPageToken, folderList, rootId) {
    drive.files.list({
        pageToken: nextPageToken ? nextPageToken : "",
        pageSize: 1000,
        q: "mimeType='application/vnd.google-apps.folder'",
        fields: "files(id,name,parents),nextPageToken",
    }, (err, {data}) => {
        if (err) return console.log('The API returned an error: ' + err);
        const token = data.nextPageToken;
        Array.prototype.push.apply(folderList, data.files);
        if (token) {
            getFolderTree(drive, token, folderList, rootId);
        } else {

            // Please input folder ID.
            const inputId = "### Folder ID ###";

            const folderId = rootId;
            const folderTree = function c(folder, folderSt, res) {
                let ar = folderList.filter(e => e.parents[0] == folder);
                folderSt += folder + "#_aabbccddee_#";
                let arrayFolderSt = folderSt.split("#_aabbccddee_#");
                arrayFolderSt.pop();
                res.push(arrayFolderSt);
                ar.length == 0 && (folderSt = "");
                ar.forEach(e => c(e.id, folderSt, res));
                return res;
            }(folderId, "", []);
            let result = folderTree.filter(e => ~e.indexOf(inputId));
            if (result.length > 2) result.shift();

            // Output result.
            console.log(result);
        }
    });
}

如上,当folderId_2b输入到inputId时,可以得到如下结果。

[
    ["topFolderId","folderId_2b","folderId_3a"],
    ["topFolderId","folderId_2b","folderId_3b"]
]

关于javascript - 如何找到 Google 云端硬盘文件的整个父文件夹层次结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50416340/

相关文章:

javascript - React defaultValue 不工作 axios 传递动态数据

go - Google Drive SDK 版本 3 中的文件上传

javascript - 如何使用 Nashorn 的 JSObject 进行字符串连接

php - Github 发布 jquery 插件

javascript - 使用 node-jose,如何解密刚刚加密的数据?

python - Google REST HTTP 请求提供比 google-api-python-client Python 请求更多的属性

ios - 无法通过 google drive api 上传/下载文件

javascript - 如何在 React Native 中更新状态并决定更新状态

javascript - 如何在 JavaScript 中计算在线菜单上的订单成本

java - 我应该如何设计一个 wordpress 后端 + react + java 前端应用程序?