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

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无法正确解析请求体里的文件数据,所以返回了“文件格式无效”的错误。

修正步骤

  1. 移除手动设置的Content-Type头:删掉header数组里的"content-type: multipart/form-data"项,让curl自动生成正确的请求头。
  2. 完善curl_file_create参数(可选但推荐):给curl_file_create传入文件名和MIME类型,帮助API更准确识别文件类型。
  3. 增加错误检查:验证文件是否成功上传到服务器临时目录,避免后续操作出错。

修正后的完整代码

<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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:11:51