使用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
相关产品推荐
相关产品推荐

