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

不使用Google API库如何通过PHP构造请求上传文件至Google Drive

明确结论

完全可以,不需要依赖Google官方提供的API客户端库,直接通过PHP构造符合规范的HTTP请求,就能实现Google Drive的文件上传功能。

前置准备
  • 提前获取有效的Google OAuth2访问令牌,申请令牌时要开通对应Drive操作权限:如果只需要操作应用自己创建的文件,申请drive.file权限即可;如果需要操作Drive内所有文件,申请全量Drive权限,令牌在有效期内才能正常调用接口。
  • 根据文件大小、业务需求选择对应上传模式:5MB以内的小文件可选简单上传、分段上传模式,5MB以上的大文件推荐使用可恢复(断点续传)上传模式。
具体实现代码示例

以下示例基于PHP原生cURL扩展实现,不需要安装任何第三方依赖:

简单上传模式(仅传文件,不带自定义元数据)

适合快速上传小文件的场景,请求参数uploadType设为media:

// 配置项
$accessToken = '替换成你自己的有效OAuth2访问令牌';
$localFilePath = '/path/to/your/local/file.pdf'; // 替换为本地待上传文件路径
$mimeType = 'application/pdf'; // 替换为待上传文件对应的MIME类型

// 初始化cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://www.googleapis.com/upload/drive/v3/files?uploadType=media');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer ' . $accessToken,
    'Content-Type: ' . $mimeType,
    'Content-Length: ' . filesize($localFilePath)
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, file_get_contents($localFilePath));

// 执行请求
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

// 处理返回结果,HTTP状态码为200代表上传成功,$response是包含文件ID等信息的JSON字符串
var_dump($httpCode, json_decode($response, true));

分段上传模式(同时传文件元数据+文件内容)

如果需要在上传时同时指定文件名、父文件夹ID等元数据,使用multipart模式,请求参数uploadType设为multipart:

// 配置项
$accessToken = '替换成你自己的有效OAuth2访问令牌';
$localFilePath = '/path/to/your/local/file.jpg';
$mimeType = 'image/jpeg';
$fileMetadata = [
    'name' => '自定义上传后的文件名.jpg',
    'parents' => ['替换为目标文件夹的ID'] // 不传该参数默认上传到Drive根目录
];

// 构造multipart请求体
$boundary = md5(time());
$delimiter = '--' . $boundary;
$body = '';
// 第一部分:文件元数据
$body .= $delimiter . "\r\n";
$body .= "Content-Type: application/json; charset=UTF-8\r\n\r\n";
$body .= json_encode($fileMetadata) . "\r\n";
// 第二部分:实际文件内容
$body .= $delimiter . "\r\n";
$body .= 'Content-Type: ' . $mimeType . "\r\n\r\n";
$body .= file_get_contents($localFilePath) . "\r\n";
$body .= $delimiter . '--';

// 初始化cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer ' . $accessToken,
    'Content-Type: multipart/related; boundary=' . $boundary,
    'Content-Length: ' . strlen($body)
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);

// 执行请求
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

// HTTP状态码为200代表上传成功,解析返回的JSON即可拿到文件ID等信息
var_dump($httpCode, json_decode($response, true));
注意事项
  • 所有接口请求必须使用HTTPS协议发送,明文HTTP请求会被服务端直接拒绝。
  • 所有上传请求必须携带合法的Authorization请求头,格式固定为Authorization: Bearer {访问令牌},令牌过期需要提前走刷新流程,否则会返回401鉴权失败。
  • 请求携带的uploadType参数必须和实际构造的请求体格式匹配,参数错误会直接返回400请求错误。
  • 上传超过5MB的大文件时,推荐使用可恢复上传模式:第一步先发送元数据初始化上传会话,拿到专属的上传URI后,再将文件分片逐段上传,支持断点续传,避免网络波动导致大文件重传。
  • 构造multipart请求时,分隔符boundary不能和请求体内的内容重复,各段的Content-Type要准确设置,否则接口无法正确解析内容。
  • 上传成功后接口返回的JSON数据中,id字段即为上传后文件在Drive内的唯一标识,后续可以用这个ID做权限设置、分享、删除等操作。

内容的提问来源于stack exchange,提问作者lukman nakib

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 04:51:22