如何通过PHP的CURL正确将文件上传至Google Drive指定文件夹
问题原因与修复方案
你的代码存在三个核心问题,导致文件没有上传到指定文件夹:
错误设置请求头Content-Type
使用multipart类型上传时,不能手动将Content-Type设为文件的MIME类型,CURL会自动生成正确的multipart/form-data请求头(包含边界符),手动设置会破坏多部分请求的结构。POST字段处理错误
你将POST字段用json_encode转为字符串,但multipart上传需要传递数组结构,且你错误定义了metadata字段格式,导致Google API无法正确解析parents参数。元数据参数传递无效
重复定义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
相关产品推荐
相关产品推荐

