PHP Curl操作Google Drive:判断并创建指定根目录文件夹
解决Google Drive服务账号通过PHP Curl获取文件夹为空及指定文件夹上传问题
为什么返回空文件夹列表?
服务账号拥有独立的Google Drive存储空间,默认根目录是空的;另外,你的查询请求可能缺少必要的过滤参数,导致未正确筛选出文件夹。
正确获取根目录下"My Folder"的步骤
1. 修正文件夹查询请求
确保请求中包含文件夹类型过滤和根目录限定,同时指定返回必要字段:
function getGoogleDriveFolderId($access_token, $folderName = 'My Folder') { $url = 'https://www.googleapis.com/drive/v3/files'; $params = http_build_query([ 'q' => "mimeType='application/vnd.google-apps.folder' and name='$folderName' and parents='root'", 'fields' => 'files(id,name)', 'spaces' => 'drive' ]); $fullUrl = $url . '?' . $params; $ch = curl_init($fullUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Authorization: Bearer ' . $access_token, 'Content-Type: application/json' ]); $response = curl_exec($ch); curl_close($ch); $result = json_decode($response, true); if (!empty($result['files'])) { return $result['files'][0]['id']; // 返回已存在的文件夹ID } return false; // 文件夹不存在 }
2. 创建指定文件夹(如果不存在)
如果上述函数返回false,执行创建请求:
function createGoogleDriveFolder($access_token, $folderName = 'My Folder') { $url = 'https://www.googleapis.com/drive/v3/files'; $postData = json_encode([ 'name' => $folderName, 'mimeType' => 'application/vnd.google-apps.folder', 'parents' => ['root'] ]); $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Authorization: Bearer ' . $access_token, 'Content-Type: application/json' ]); $response = curl_exec($ch); curl_close($ch); $result = json_decode($response, true); return isset($result['id']) ? $result['id'] : false; }
3. 整合逻辑并上传文件
先获取或创建文件夹ID,再将文件上传至该文件夹:
// 假设你已通过服务账号获取有效的access_token $access_token = '你的服务账号access_token'; // 获取或创建文件夹ID $folderId = getGoogleDriveFolderId($access_token); if (!$folderId) { $folderId = createGoogleDriveFolder($access_token); } // 上传文件到指定文件夹 function uploadFileToDriveFolder($access_token, $folderId, $filePath, $fileName) { $url = 'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart'; // 构建元数据部分 $metadata = json_encode([ 'name' => $fileName, 'parents' => [$folderId] ]); // 构建multipart请求体 $boundary = uniqid(); $body = "--$boundary\r\n"; $body .= "Content-Type: application/json; charset=UTF-8\r\n\r\n"; $body .= $metadata . "\r\n"; $body .= "--$boundary\r\n"; $body .= "Content-Type: application/octet-stream\r\n\r\n"; $body .= file_get_contents($filePath) . "\r\n"; $body .= "--$boundary--"; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $body); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Authorization: Bearer ' . $access_token, 'Content-Type: multipart/related; boundary=' . $boundary ]); $response = curl_exec($ch); curl_close($ch); return json_decode($response, true); } // 调用上传示例 $uploadResult = uploadFileToDriveFolder($access_token, $folderId, '/path/to/your/file.jpg', '上传的文件名.jpg');
关键注意事项
- 服务账号的Drive空间独立于个人Drive,若要访问个人Drive中的文件夹,需将服务账号邮箱(在服务账号密钥文件中可找到)添加到目标文件夹的共享列表,赋予编辑权限。
- 确保服务账号已启用Google Drive API,且拥有正确的OAuth2范围(如
https://www.googleapis.com/auth/drive)。 - 若获取access_token失败,需检查服务账号JWT签名是否正确,或是否有权限访问Drive API。
内容的提问来源于stack exchange,提问作者Francisco Morales
相关产品推荐
相关产品推荐

