google 驱动器 API 搜索具有给定文件夹 ID 的所有子文件

google drive API search all children file with given folder ID

下面是我的文件夹在 google 驱动器中的结构:

Picture
    |----------Date1
                 |-----Pic1.png
                 |-----Pic2.png
    |----------Date2
                 |-----Pic3.png
                 |-----Pic4.png

现在我只有Picture文件夹的ID(parentID文件夹)。现在我想获取 Pic1 图片(在 Date1 文件夹内)。是否只查询1次就可以得到只有Picture文件夹ID的图片,还是要查询多次(获取Date1和Date2文件夹ID,然后继续查询)?

这是我现在的代码

$imageName= "Pic1" // name of the image I want to find, which is Pic1
$folderId = "PictureFolderId" // Folder Picture's ID
$optParams = array(
            'pageSize' => 1,
            'fields' => 'nextPageToken, files(contentHints/thumbnail,fileExtension,id,name,size)',
            'q' =>"mimeType contains 'image/' AND name contains '".$imageName."' AND '".$folderId."' in parents"
          );
          $results = $googleDriveService->files->listFiles($optParams);
          
        if (count($results->getFiles()) == 0) {
            print "No files found.\n";
        } else {
            // Do something.
        }

如果我理解正确的话,你想要:

  • 检索某个文件夹的所有后代图像文件(children、grandchildren 等)。
  • 您想通过一次 API 调用来检索它。

答案:

目前无法通过一次调用检索 sub-folders 中的文件。这是因为 File resource(“文件夹”是 File)没有关于此 parent 文件夹中包含哪些文件的信息(更不用说“sub-folders 中包含的文件了]") 并且它只有关于此文件夹的直接 parent 的信息,而不是 grandparent 等等,可以这么说。

为了检索某个文件夹的所有“后代”,可以使用两种主要方法(主要基于):

方法一、列出所有文件夹:

  • 通过 Files: list 列出您云端硬盘中的所有文件夹,无论它们是否具有 parent 中的主文件夹 ID。我们称此列表为 All folders.
  • 过滤All folders,根据它们是否在parents中有主文件夹ID。我们称此列表为 Direct children.
  • 对于Direct children中的每个元素,根据在parent中是否有对应的direct child过滤All folders。这样,您将检索 Grandchildren 的列表。对每个 Grandchildren 元素重复相同的过程,然后对每个 Great-grandchildren 重复相同的过程,依此类推,直到没有文件夹为止。这样,您将检索到主文件夹 ID 为 descendant 的所有文件夹。
  • 一旦你拥有了所有 descendant 文件夹,你必须再创建一个 Files: list 来找到任何这些文件夹的图像 children,或者从主文件夹.搜索查询可能是这样的:
mimeType contains 'image/' AND ('mainFolderId' in parents OR 'descendant1ID' in parents OR 'descendant2ID' in parents OR...)
  • 注意:该方法调用次数较少API,如果文件树比较大,会更合适。

方法二、递归迭代:

  • 使用 Files: list 列出主文件夹中的所有文件,这些文件可以是文件夹(因此应该列出它们自己的 children)或图像。在这种情况下,搜索查询将类似于:
(mimeType = 'application/vnd.google-apps.folder' OR mimeType contains 'image/') AND 'folderId' in parents
  • 对于此调用返回的每个 child,检查它是图像(包含 image/ 的 MIME 类型)还是文件夹(MIME 类型:application/vnd.google-apps.folder)。对于每个文件夹,使用上一步中的方法列出其中包含的所有文件。
  • 重复这两个步骤,直到没有文件夹为止。您检索到的所有图像都是您主文件夹的“后代”。

备注:

Issue Tracker 中有一个开放的功能请求,可以在查询搜索中包含 ancestors,这可以允许在子文件夹中检索 children,并使整个过程更加容易。您可以单击所引用页面左上角的星号以跟踪此请求并帮助确定其优先级:

参考: