如何验证Google Shared Drives中文件夹是否存在?现有PHP代码失效求助
你的函数在普通云端硬盘正常,但共享盘失效,核心原因是Google Drive API默认不会返回共享盘内容,需要添加特定参数并调整逻辑:
关键修正点
- 必须在API请求中添加两个参数:
includeItemsFromAllDrives=true和supportsAllDrives=true,否则API会忽略共享盘内的文件/文件夹。 - 无需添加
sharedWithMe条件,该条件仅适用于个人盘中被共享的内容,和Shared Drives无关。 - 确保你的
access_token拥有访问目标共享盘的权限(比如账号是共享盘成员,或服务账号已被授权访问该共享盘)。
修改后的完整函数
public function ExistsFolderOnDrive($access_token, $folder_name, $parent_folder_id) { // 构建查询语句,保留原逻辑,无需添加sharedWithMe $query = "mimeType='application/vnd.google-apps.folder' and trashed=false and name='$folder_name' and '$parent_folder_id' in parents"; // 拼接API URL,添加共享盘必需的参数 $apiURL = self::DRIVE_FILES_URI . "?q=" . urlencode($query) . "&includeItemsFromAllDrives=true&supportsAllDrives=true"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $apiURL); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Bearer ' . $access_token)); $data = json_decode(curl_exec($ch), true); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($http_code != 200) { $error_msg = 'Failed to retrieve folder from Google Drive'; if (curl_errno($ch)) { $error_msg = curl_error($ch); } throw new Exception('Error ' . $http_code . ': ' . $error_msg); } if (empty($data['files'])) { // 文件夹不存在 return false; } else { // 返回第一个匹配的文件夹ID return $data['files'][0]['id']; } }
额外注意事项
- 如果
parent_folder_id是共享盘本身的ID,该查询会直接检查共享盘根目录下的目标文件夹。 - 若遇到403权限错误,需确认:
- 授权时请求了足够的权限(至少
drive.readonly,需修改则用drive)。 - 访问共享盘的账号已被添加为共享盘成员(服务账号需在共享盘成员列表中)。
- 授权时请求了足够的权限(至少
- 若存在同名文件夹,函数会返回第一个匹配的ID,需精确匹配可添加更多条件(如创建时间、所有者等)。
内容的提问来源于stack exchange,提问作者Ampopo
相关产品推荐
相关产品推荐

