如何使用PHP调用Google Drive API按所有者获取所有文件与文件夹
实现方案说明
Google Drive API的q查询参数不支持直接对返回结果按所有者分组,所以推荐采用「API筛选所需数据 + PHP层面做分组」的组合方案,兼顾性能和灵活度。
具体调整步骤
- 第一步:调整API查询参数,拉取全量所需数据
你当前的q参数仅返回共享给你的文件夹,可根据实际需求调整筛选条件,比如拉取所有未删除的文件+文件夹,示例参数调整如下:
$parameters['pageSize'] = 1000; // 单页最大支持1000条,减少请求次数 $parameters['q'] = "trashed=false"; // 排除回收站内容,如需只拿文件夹可加 and mimeType='application/vnd.google-apps.folder' $parameters['fields'] = 'files(id, name, modifiedTime, mimeType, owners), nextPageToken';
注意如果数据量超过单页上限,需要通过nextPageToken循环拉取所有数据,避免漏数。
- 第二步:PHP层面按所有者完成分组
拿到所有文件数据后不要直接输出,先遍历存入以所有者邮箱为key的数组中完成分组:
$groupedFiles = []; $files = $service->files->listFiles($parameters); // 这里可以补充分页循环逻辑,拿到nextPageToken后重复调用listFiles直到token为空 foreach ($files as $file) { $owners = $file->getOwners(); foreach ($owners as $owner) { $ownerEmail = $owner->getEmailAddress(); // 初始化所有者分组 if (!isset($groupedFiles[$ownerEmail])) { $groupedFiles[$ownerEmail] = [ 'ownerName' => retrieve_name($ownerEmail), 'items' => [] ]; } $groupedFiles[$ownerEmail]['items'][] = $file; } }
- 第三步:遍历分组后的数据渲染页面
分组完成后遍历输出即可实现按所有者展示的效果:
foreach ($groupedFiles as $ownerEmail => $ownerInfo) { // 输出所有者分区标题 echo "<tr><td colspan='2'><strong>{$ownerInfo['ownerName']} 的内容</strong></td></tr>"; // 输出该所有者下的所有文件/文件夹 foreach ($ownerInfo['items'] as $item) { $icon = $item->getMimeType() === 'application/vnd.google-apps.folder' ? "<i class='ti-folder'></i>" : "<i class='ti-file'></i>"; echo "<tr> <td><large>{$icon}</large> <a href='rmsystems.php?shared&&id={$item->getId()}&&foldername={$item->getName()}&&email={$ownerEmail}'>". folder_from_rename($item->getName())." <span class='badge badge-primary'>link</span> </a></td> <td><i class='ti-crown'></i> {$ownerInfo['ownerName']}</td> </tr>"; } }
补充提示
如果只需要查询特定所有者的内容,可直接在q参数添加'目标邮箱地址' in owners做提前筛选,不需要拉取全量数据再过滤,性能更高。
内容的提问来源于stack exchange,提问作者Mon Padi
相关产品推荐
相关产品推荐

