不使用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
相关产品推荐
相关产品推荐

