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

2024-04-15

这是我的文件夹在谷歌驱动器中的结构:

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

现在我只有Picture文件夹(parentID文件夹)的ID。现在我想获取 Pic1 图片(在 Date1 文件夹内)。是否可以仅查询 1 次来获取仅包含图片文件夹 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.
        }

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

  • 检索某个文件夹的子代(子代、孙代等)的所有图像文件。
  • 您希望通过一次 API 调用来检索此信息。

Answer:

目前无法通过一次调用检索子文件夹中的文件。那是因为一个文件资源 https://developers.google.com/drive/api/v3/reference/files(“文件夹”是File)没有有关此父文件夹中包含哪些文件的信息(更不用说“子文件夹”中包含的文件),并且它仅具有有关此文件夹的直接父级的信息,而不是祖父母等的信息。

为了检索某个文件夹的所有“后代”,可以使用两种主要方法(很大程度上基于pinoyyid 的回答 https://stackoverflow.com/a/41741521/10612011):

方法1.列出所有文件夹:

  • 通过以下方式列出您的云端硬盘中的所有文件夹文件:列表 https://developers.google.com/drive/api/v3/reference/files/list,不管它们在父级中是否有主文件夹 ID。我们称这个列表为All folders.
  • Filter All folders,根据他们是否有父母的主文件夹ID。我们称这个列表为Direct children.
  • 对于中的每个元素Direct children, 筛选All folders根据是否有相应的direct child在父母中。这样,您将检索到的列表Grandchildren。对每个重复相同的过程Grandchildren元素,那么对于每个Great-grandchildren依此类推,直到没有文件夹为止。这样,您将检索到所有文件夹descendant主文件夹 ID。
  • 一旦你拥有了所有descendant文件夹,你必须创建另一个Files: list查找属于任何这些文件夹的子级的图像,或者从主文件夹中查找图像。搜索查询可能是这样的:
mimeType contains 'image/' AND ('mainFolderId' in parents OR 'descendant1ID' in parents OR 'descendant2ID' in parents OR...)
  • Note:这种方法需要的API调用较少,如果文件树比较大的话会比较合适。

方法2.递归迭代:

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

Notes:

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

  • 问题#111763024。您什么时候允许我们在搜索中使用“祖先”字段? https://issuetracker.google.com/issues/111763024

参考:

  • 如何在 Google 云端硬盘中搜索子文件夹和子子文件夹? https://stackoverflow.com/q/41741520/10612011
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

谷歌驱动器API搜索具有给定文件夹ID的所有子文件 的相关文章

随机推荐