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

如何通过PHP的CURL正确将文件上传至Google Drive指定文件夹

问题原因与修复方案

你的代码存在三个核心问题,导致文件没有上传到指定文件夹:

  1. 错误设置请求头Content-Type
    使用multipart类型上传时,不能手动将Content-Type设为文件的MIME类型,CURL会自动生成正确的multipart/form-data请求头(包含边界符),手动设置会破坏多部分请求的结构。

  2. POST字段处理错误
    你将POST字段用json_encode转为字符串,但multipart上传需要传递数组结构,且你错误定义了metadata字段格式,导致Google API无法正确解析parents参数。

  3. 元数据参数传递无效
    重复定义name字段,且metadata的写法不符合API要求,最终导致parents参数未被识别,文件默认上传到根目录。


修正后的完整代码

$file_path = 'baby.png';
$folder_id = '你的目标文件夹ID'; // 替换为实际文件夹ID

$mimetype = mime_content_type($file_path);
$filename = basename($file_path);

// 构造文件元数据:指定文件名和目标文件夹
$metadata = json_encode([
    'name' => $filename,
    'parents' => [$folder_id]
]);

// 仅保留授权头,Content-Type由CURL自动处理
$headers = [
    "Authorization: Bearer $access_token"
];

// 构造multipart请求的两个部分:元数据JSON、文件内容
$post_fields = [
    'metadata' => [
        'name' => 'metadata',
        'contents' => $metadata,
        'type' => 'application/json;charset=UTF-8'
    ],
    'file' => new CURLFile($file_path, $mimetype, $filename)
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
// 启用SSL验证,确保请求安全
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);

$response = curl_exec($ch);
curl_close($ch);

var_dump($response);

关键说明

  • 元数据正确传递:将name和parents打包为JSON字符串,作为multipart请求的独立部分,明确告诉Google Drive文件的存放位置和名称。
  • 请求头简化:移除手动设置的Content-Type,让CURL自动生成符合要求的multipart请求头。
  • 权限与文件夹验证:确保你的$access_token拥有https://www.googleapis.com/auth/drive.file或更高权限,且目标文件夹ID正确、授权账号有权访问该文件夹。

内容的提问来源于stack exchange,提问作者Nancy Moore

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 02:48:28