这是我的文件夹在 google drive 中的结构:
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.
}
最佳答案
如果我没理解错的话,你想要:
- 检索属于某个文件夹的后代(子代、孙代等)的所有图像文件。
- 您想通过单个 API 调用检索它。
回答:
目前无法通过一次调用检索子文件夹中的文件。那是因为 File resource (“文件夹”是一个 File
)没有关于这个父文件夹中包含哪些文件的信息(更不用说“子文件夹”中包含的文件了),它只有关于直接的信息这个文件夹的 parent ,而不是祖 parent 等等,可以这么说。
为了检索某个文件夹的所有“后代”,可以使用两种主要方法(主要基于 this answer by pinoyyid ):
方法一、列出所有文件夹:
- 通过 Files: list 列出您云端硬盘中的所有文件夹,不管它们在父级中是否有主文件夹 ID。我们称此列表为
所有文件夹
。 - 过滤
所有文件夹
,根据它们是否在父文件夹中有主文件夹ID。我们称此列表为Direct children
。 - 对于
Direct children
中的每个元素,根据它们在parents中是否有对应的direct child
过滤All folders
。这样,您将检索Grandchildren
列表。对每个Grandchildren
元素重复相同的过程,然后对每个Great-grandchildren
重复相同的过程,依此类推,直到没有文件夹为止。这样,您将检索到所有作为主文件夹 ID 的后代
的文件夹。 - 一旦你有了所有的
descendant
文件夹,你必须制作另一个Files: list
来找到这些文件夹中的任何子文件夹的图像,或者来自主文件夹文件夹。搜索查询可能是这样的:
mimeType contains 'image/' AND ('mainFolderId' in parents OR 'descendant1ID' in parents OR 'descendant2ID' in parents OR...)
- 注意:该方法API调用次数较少,如果文件树比较大,会更合适。
方法二、递归迭代:
- 使用Files: list列出主文件夹中的所有文件,这些文件可以是文件夹(因此应该列出它们自己的子文件夹)或图像。在这种情况下,搜索查询将类似于:
(mimeType = 'application/vnd.google-apps.folder' OR mimeType contains 'image/') AND 'folderId' in parents
- 对于此调用返回的每个子项,检查它是图像(MIME 类型包含
image/
)还是文件夹(MIME 类型:application/vnd.google-apps.folder
)。对于每个文件夹,使用上一步中的方法列出其中包含的所有文件。 - 重复这两个步骤,直到没有文件夹为止。您检索到的所有图像都是主文件夹的“后代”。
注意事项:
Issue Tracker 中有一个开放的功能请求,可以在查询搜索中包含 ancestors
,这可以允许在子文件夹中检索子项,并使整个过程更加容易。您可以单击所引用页面左上角的星标,以跟踪此请求并帮助确定其优先级:
引用:
关于google-api - google drive API 搜索具有给定文件夹 ID 的所有子文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62652183/