使用Curl上传CSV至Google Drive报错:Bad content type. Please use multipart.
问题分析与修复方案
你遇到的"Bad content type. Please use multipart."错误,根源在于multipart请求的格式不规范,以下是具体问题和修复步骤:
核心问题点
- Content-Type头格式错误:
multipart/related需要明确指定boundary参数,正确格式应为multipart/related; boundary="section_divider",你的写法缺少boundary=标识。 - Authorization头缺少空格:
Bearer和令牌之间必须有空格,否则会导致身份验证失败。 - JSON格式错误:
"name": "test.xlsx",末尾多了逗号,会触发JSON解析错误。 - 文件部分Content-Type多余逗号:
Content-Type: '.$mime_type.',里的逗号会破坏请求格式。 - Multipart分隔格式不规范:每个部分的头和内容之间需要空行分隔,且分隔符前后的换行要正确,避免多余缩进导致格式混乱。
修复后的完整代码
public function uploadFileToDrive($token, $fileContent){ echo "Iniciando subida de archivo a drive .... "; try { $apiUrl = 'https://www.googleapis.com/'; $ch1 = curl_init(); $mime_type = 'text/csv'; // 定义分隔符,避免特殊字符 $boundary = 'section_divider'; // 构建规范的multipart内容,注意换行和空行要求 $data = "--{$boundary} Content-Type: application/json; charset=UTF-8 { \"name\": \"test.csv\" } --{$boundary} Content-Type: {$mime_type} {$fileContent} --{$boundary}-- "; curl_setopt($ch1, CURLOPT_URL, $apiUrl . 'upload/drive/v3/files?uploadType=multipart'); curl_setopt($ch1, CURLOPT_POST, 1); curl_setopt($ch1, CURLOPT_POSTFIELDS, $data); curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true); // 修复HTTP头格式 curl_setopt($ch1, CURLOPT_HTTPHEADER, array( 'Content-Type: multipart/related; boundary="' . $boundary . '"', 'Authorization: Bearer ' . $token )); $response = curl_exec($ch1); if ($response === false) { echo 'Curl error: ' . curl_error($ch1); } else { echo "Operation completed without any errors "; $output = $response; } curl_close($ch1); var_dump($output); return $output; } catch (Exception $e) { print "An error occurred: " . $e->getMessage(); } }
额外优化建议
- 文件名改为
test.csv更符合实际上传的文件类型,避免混淆。 - 建议使用
PHP_EOL替代硬编码的换行符,保证跨平台兼容性。 - 生产环境建议开启
CURLOPT_SSL_VERIFYPEER和CURLOPT_SSL_VERIFYHOST参数,提升请求安全性。
内容的提问来源于stack exchange,提问作者Francisco Morales
相关产品推荐
相关产品推荐

