You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 18:03:16