【问题标题】:google drive API search all children file with given folder ID谷歌驱动 API 搜索具有给定文件夹 ID 的所有子文件
【发布时间】:2020-06-30 07:19:10
【问题描述】:

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

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

现在我只有图片文件夹(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.
        }

【问题讨论】:

  • 你有图片的名字和它的父ID吗?请编辑您的问题并包含您的代码。
  • 是的。我在下面添加了我目前拥有的代码。
  • try 'fields' => '*',它会将完整的文件对象返回给你。

标签: google-api google-drive-api parent-child


【解决方案1】:

如果我理解正确,您希望:

  • 检索属于某个文件夹的后代(子、孙等)的所有图像文件。
  • 您希望通过单个 API 调用来检索它。

答案:

目前无法通过一次调用检索子文件夹中的文件。这是因为File resource(而“文件夹”是File)没有关于该父文件夹中包含哪些文件的信息(更不用说“子文件夹”中包含的文件了),它只有关于这个文件夹的直系父母,而不是祖父母等等。

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

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

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

方法2.递归迭代:

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

注意事项:

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

参考:

【讨论】:

  • 感谢您的具体回答。我会尝试第一种方式。
猜你喜欢
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
相关资源
最近更新 更多