PHP上传图片至Google街景发布API遇400错误:文件格式验证异常
解决Google街景发布API上传图片的400格式无效错误
我帮你排查下这个400错误的问题,核心原因是你手动设置了Content-Type请求头,干扰了curl自动处理multipart表单的逻辑。
问题根源
当你使用curl_file_create并将文件对象放到CURLOPT_POSTFIELDS的数组中时,curl会自动生成正确的multipart/form-data请求头,其中包含自动生成的boundary值(就是你错误提示里的那串------------------------749c9bf517f13444)。但你手动添加了content-type: multipart/form-data这行请求头,没有带上对应的boundary,导致Google API无法正确解析请求体里的文件数据,所以返回了“文件格式无效”的错误。
修正步骤
- 移除手动设置的Content-Type头:删掉header数组里的
"content-type: multipart/form-data"项,让curl自动生成正确的请求头。 - 完善curl_file_create参数(可选但推荐):给
curl_file_create传入文件名和MIME类型,帮助API更准确识别文件类型。 - 增加错误检查:验证文件是否成功上传到服务器临时目录,避免后续操作出错。
修正后的完整代码
<form action="" method="post" enctype="multipart/form-data"> Select image to upload: <input type="file" name="fileToUpload" value="choose"> <input type="hidden" name="upurl" value="<?php echo $upload_url;?>"> <input type="hidden" name="token" value="<?php echo $access_token;?>"> <input type="submit" value="Upload Image"> </form> <?php if (isset($_FILES['fileToUpload'])) { // 先检查服务器端文件上传是否出错 if ($_FILES['fileToUpload']['error'] !== UPLOAD_ERR_OK) { echo "文件上传到服务器失败,错误码:" . $_FILES['fileToUpload']['error']; exit; } $upload_url = $_POST['upurl']; $access_token = $_POST['token']; $tmpFilePath = $_FILES['fileToUpload']['tmp_name']; $fileName = $_FILES['fileToUpload']['name']; $fileType = $_FILES['fileToUpload']['type']; // 确保临时文件存在 if (!file_exists($tmpFilePath)) { echo "临时文件不存在,请检查服务器临时目录权限"; exit; } $ch = curl_init(); // 传入文件名和MIME类型,帮助API识别文件 $cfile = curl_file_create($tmpFilePath, $fileType, $fileName); $data = array("media" => $cfile); // 只保留Authorization头,移除手动设置的Content-Type $header = array("authorization: Bearer $access_token"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_URL, $upload_url); // 开启返回响应内容,方便排查API返回的具体错误 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 可选:开启SSL验证(生产环境建议开启,测试环境可关闭) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); $response = curl_exec($ch); $curlInfo = curl_getinfo($ch); curl_close($ch); echo "请求信息:<br>"; print_r($curlInfo); echo "<br><br>API响应:<br>"; print_r($response); if ($curlInfo['http_code'] === 200) { echo "<br><br>文件上传成功!"; } else { echo "<br><br>上传失败,HTTP状态码:" . $curlInfo['http_code']; } } ?>
额外注意事项
- 确认上传的图片是Google街景API支持的格式(仅JPG格式),避免上传PNG、GIF等不兼容格式。
- 检查
$access_token是否拥有streetviewpublish.photos.create或对应的权限,确保令牌有效且未过期。 - 确认
$upload_url是正确的API端点,格式应为https://streetviewpublish.googleapis.com/v1/photo:startUpload(根据API版本调整)。
内容的提问来源于stack exchange,提问作者Veeresh
相关产品推荐
相关产品推荐

