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

使用PHP调用Gemini API上传文件遇MIME类型错误求助

Gemini API 文件上传导致聊天功能失效问题

原本包含聊天历史的Gemini API聊天功能运行正常,但取消注释添加文件URL到请求Payload的代码后,功能完全失效。

相关PHP代码

// 添加用户消息到历史
$history[] = ["role" => "user", "parts" => [["text" => $userMessage]]];

// 将文件URI作为独立部分添加到历史
// if (!empty($fileUris)) {
//     $history[] = [
//         "role" => "user",
//         "parts" => array_merge(
//             array_map(fn($fileUri) => ["fileData" => $fileUri], $fileUris)
//         )
//     ];
// }

$payload = [
    "contents" => $history,
    "systemInstruction" => [
        "role" => "user",
        "parts" => [
            ["text" => $instructions]
        ]
    ],
    "generationConfig" => [
        "temperature" => 1,
        "topK" => 40,
        "topP" => 0.95,
        "maxOutputTokens" => 8192,
        "responseMimeType" => "text/plain"
    ]
];

$requestBody = json_encode($payload, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
file_put_contents('debug_payload.json', $requestBody);

// 可选模型:gemini-2.0-flash-exp、gemini-exp-1206、gemini-1.5-pro、gemini-1.5-flash-8b
$api_version = 'gemini-1.5-flash-8b';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://generativelanguage.googleapis.com/v1beta/models/{$api_version}:streamGenerateContent?alt=sse&key=" . API_KEY);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type: application/json"]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $requestBody);
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function ($ch, $chunk) use ($historyFile, &$history, $textResponseLog) {
    $lines = explode("data: ", $chunk);
    foreach ($lines as $line) {
        $line = trim($line);
        if ($line) {
            $json = json_decode($line, true);
            if (isset($json['candidates'][0]['content']['parts'])) {
                foreach ($json['candidates'][0]['content']['parts'] as $part) {
                    if (isset($part['text'])) {
                        $history[] = ["role" => "model", "parts" => [["text" => $part['text']]]];
                        file_put_contents($historyFile, json_encode($history, JSON_PRETTY_PRINT));
                        echo "data: " . json_encode(["response" => $part['text']]) . "

";
                        ob_flush();
                        flush();
                    }
                }
            }
        }
    }
    file_put_contents($textResponseLog, $chunk, FILE_APPEND);
    return strlen($chunk);
});

curl_exec($ch);
curl_close($ch);

实际发送的请求Payload

{
    "contents": [
        {
            "role": "user",
            "parts": [
                {
                    "text": "Hey"
                }
            ]
        },
        {
            "role": "user",
            "parts": [
                {
                    "fileData": {
                        "fileUri": "https://generativelanguage.googleapis.com/v1beta/files/6sr9bb3f4w61",
                        "mimeType": "application/json"
                    }
                },
                {
                    "fileData": {
                        "fileUri": "https://generativelanguage.googleapis.com/v1beta/files/snrd7cowjb45",
                        "mimeType": "application/json"
                    }
                },
                {
                    "fileData": {
                        "fileUri": "https://generativelanguage.googleapis.com/v1beta/files/g38bsh0fw458",
                        "mimeType": "application/json"
                    }
                }
            ]
        }
    ],
    "systemInstruction": {
        "role": "user",
        "parts": [
            {
                "text": "Instructions ..."
            }
        ]
    },
    "generationConfig": {
        "temperature": 1,
        "topK": 40,
        "topP": 0.95,
        "maxOutputTokens": 8192,
        "responseMimeType": "text/plain"
    }
}

收到的错误信息

使用gemini-1.5-flash-8b或gemini-2.0-flash-exp均出现报错:

{
  "error": {
    "code": 400,
    "message": "无法提交请求,因为存在值为application/json的mimeType参数,该类型不被支持。请更新mimeType后重试。",
    "status": "INVALID_ARGUMENT"
  }
}

文件上传后的返回结果

文件上传成功后,返回的MIME类型为application/json:

{
  "file": {
    "name": "files/zwfo9w8j0v9k",
    "mimeType": "application/json",
    "sizeBytes": "74",
    "createTime": "2025-01-29T20:29:30.655895Z",
    "updateTime": "2025-01-29T20:29:30.655895Z",
    "expirationTime": "2025-01-31T20:29:30.632984185Z",
    "sha256Hash": "MDI0MjRmOGQ5ZDk5YmM2MTMxMDVjMjg5ZTg2NWJjYmUxMTdhN2VjZjc2NzJlZTQ5MjU2MDg5ZGNlMWFmM2I1MQ==",
    "uri": "https://generativelanguage.googleapis.com/v1beta/files/zwfo9w8j0v9k",
    "state": "ACTIVE",
    "source": "UPLOADED"
  }
}

若强制将请求中的MIME类型改为application/pdf,会触发其他错误。

Google AI Studio官方示例代码

# 准备本地文件
FILES=("file1.pdf" "file2.pdf" "file3.pdf")
MIME_TYPES=("application/pdf" "application/pdf" "application/pdf")
for i in "${!FILES[@]}"; do
  NUM_BYTES=$(wc -c < "${FILES[$i]}")
  curl "https://generativelanguage.googleapis.com/upload/v1beta/files?key=${API_KEY}" \
    -H "X-Goog-Upload-Command: start, upload, finalize" \
    -H "X-Goog-Upload-Header-Content-Length: ${NUM_BYTES}" \
    -H "X-Goog-Upload-Header-Content-Type: ${MIME_TYPES[$i]}" \
    -H "Content-Type: application/json" \
    -d "{'file': {'display_name': '${FILES[$i]}'}}" \
    --data-binary "@${FILES[$i]}"
  # 从响应中读取file.uri并保存为FILE_URI_${i}
done

...

{
      "role": "user",
      "parts": [
        {
          "fileData": {
            "fileUri": "${FILE_URI_0}",
            "mimeType": "application/pdf"
          }
        },
        {
          "fileData": {
            "fileUri": "${FILE_URI_1}",
            "mimeType": "application/pdf"
          }
        },
        {
          "fileData": {
            "fileUri": "${FILE_URI_2}",
            "mimeType": "application/pdf"
          }
        }
      ]
    }

内容的提问来源于stack exchange,提问作者Vian Esterhuizen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 16:27:01