◉GEMINI LABEN
●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り6日。移行先は deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 が GA(10/06)。gemini-3.1-flash-image は非推奨で停止日は未発表です●MCP — ツール結果が 8.5万トークンに膨らんだ事例を、ADK で 310 トークンに包んで抑えた報告が出ています●FLASH — gemini-3.7-flash と 3.5-flash は新しい Flash モデルに自動で回されます(10/08)●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り6日。移行先は deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 が GA(10/06)。gemini-3.1-flash-image は非推奨で停止日は未発表です●MCP — ツール結果が 8.5万トークンに膨らんだ事例を、ADK で 310 トークンに包んで抑えた報告が出ています●FLASH — gemini-3.7-flash と 3.5-flash は新しい Flash モデルに自動で回されます(10/08)●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…
記事一覧/API / SDK
◈ API / SDK/2026-05-31初級

Gemini APIで「Unsupported MIME type」エラーが出るときの原因と対処

画像や音声をGemini APIに渡したときに発生する『Unsupported MIME type』エラーを、MIMEタイプの綴り間違い・octet-stream問題・非対応フォーマットの3つの観点から切り分けて、確実に動くコードで解決します。

troubleshooting59error14fix10mime-typegemini-api288file-api6multimodal24

iPhoneアプリから撮影した写真をGemini APIに送って解析させる機能を作っていたとき、ローカルのテスト画像では通るのに、実機から送られてきた画像だけが 400 INVALID_ARGUMENT. Unsupported MIME type: image/jpg で弾かれる、という現象に半日ほど悩まされました。原因は拍子抜けするほど単純で、アップロード処理が付けていたMIMEタイプの文字列が間違っていただけでした。

2014年からアプリ事業を続けている個人開発者として、マルチモーダルなAPIに画像や音声を渡す場面はここ1〜2年で一気に増えました。その中で Unsupported MIME type は、エラーメッセージのわりに原因が3つに分かれていて、切り分けを知らないと無駄に時間を溶かしやすいエラーです。順番に潰していきます。

まず確認すべきは「綴り」です — image/jpg は存在しません

最も多いのが、MIMEタイプの綴り間違いです。特に image/jpg は、拡張子の .jpg に引きずられて書いてしまいがちですが、正式なMIMEタイプとしては存在しません。JPEGの正しいMIMEタイプは image/jpeg です。

from google import genai
 
client = genai.Client(api_key="YOUR_GEMINI_API_KEY")
 
with open("photo.jpg", "rb") as f:
    image_bytes = f.read()
 
# ❌ これは弾かれる: Unsupported MIME type: image/jpg
response = client.models.generate_content(
    model="gemini-2.5-flash",
    contents=[
        {"inline_data": {"mime_type": "image/jpg", "data": image_bytes}},
        "この画像に写っているものを説明してください",
    ],
)

image/jpg を image/jpeg に直すだけで通ります。

# ✅ 正しい綴り
{"inline_data": {"mime_type": "image/jpeg", "data": image_bytes}}

同様に間違えやすいのが image/jpeg 以外の表記揺れです。Geminiが画像で受け付けるMIMEタイプは、image/png・image/jpeg・image/webp・image/heic・image/heif の5つです。iPhoneの標準フォーマットであるHEIC(image/heic)はそのまま渡せるので、わざわざJPEGに変換する必要はありません。ここは意外と知られていない点だと感じています。

拡張子からMIMEタイプを自前でマッピングしている場合は、Pythonの標準ライブラリに任せたほうが綴りミスを防げます。

import mimetypes
 
mime_type, _ = mimetypes.guess_type("photo.jpg")
print(mime_type)  # image/jpeg (正しい綴りが返る)

File APIで octet-stream になっていないか

2つめの落とし穴は、File API経由でアップロードしたファイルのMIMEタイプが application/octet-stream になっているケースです。これは20MBを超えるファイルや、繰り返し使うファイルをFile APIにアップロードするときに起きます。

client.files.upload() は、ファイルの拡張子や中身からMIMEタイプを推測しますが、推測に失敗すると application/octet-stream(汎用バイナリ)として登録されます。そのまま generate_content に渡すと、octet-streamは解析対象として非対応のため弾かれます。

アップロード直後にMIMEタイプを確認すると、推測が外れているかどうかがすぐ分かります。

uploaded = client.files.upload(file="recording.m4a")
print(uploaded.mime_type)  # application/octet-stream だと危険信号

対策は、アップロード時にMIMEタイプを明示的に指定することです。新しい google-genai SDKでは config で渡せます。

from google.genai import types
 
uploaded = client.files.upload(
    file="recording.m4a",
    config=types.UploadFileConfig(mime_type="audio/mp4"),
)
print(uploaded.mime_type)  # audio/mp4
 
response = client.models.generate_content(
    model="gemini-2.5-flash",
    contents=[uploaded, "この音声を文字起こししてください"],
)

拡張子に頼らず、自分が何を送っているかを毎回明示する。これだけでoctet-stream由来のエラーはほぼ消えます。

それでも弾かれるなら、フォーマット自体が非対応です

綴りも合っている、MIMEタイプも明示している、それでも Unsupported MIME type が出る場合は、そのフォーマットをGeminiが本当にサポートしていない可能性が高いです。

特に音声と動画はモデルやエンドポイントによって対応範囲が変わります。よく問題になるのが、iPhoneのボイスメモが出力する .m4a です。これはコンテナとしては audio/mp4 で受け付けられますが、audio/m4a や audio/x-m4a という非標準の表記で送ると弾かれます。確実に通したいときは、対応が安定している形式に変換してしまうのが早いです。

# ffmpegでm4aをmp3に変換してから渡す
import subprocess
 
subprocess.run([
    "ffmpeg", "-i", "voice.m4a", "-acodec", "libmp3lame", "voice.mp3"
], check=True)
 
uploaded = client.files.upload(
    file="voice.mp3",
    config=types.UploadFileConfig(mime_type="audio/mp3"),
)

現時点でGeminiが受け付ける主なMIMEタイプは、画像が image/png・image/jpeg・image/webp・image/heic・image/heif、音声が audio/wav・audio/mp3・audio/aiff・audio/aac・audio/ogg・audio/flac、ドキュメントが application/pdf とプレーンテキスト系です。実装前に、自分が扱うファイル形式がこのリストに入っているかを一度確認しておくと、後から慌てずに済みます。仕様は更新されることがあるので、公式のファイルプロンプトのドキュメントで最新の対応表を確認する習慣をつけておくと安心です。

再発させないための一工夫

このエラーは、ユーザーがどんなファイルを送ってくるか分からない本番環境でこそ起きます。累計5,000万ダウンロードを超えるアプリ事業を続けてきて痛感したのは、ローカルで想定したフォーマットと、世界中の実機から実際に飛んでくるフォーマットは別物だということです。私の場合、アプリ側でアップロードを受け付ける時点で、許可するMIMEタイプをホワイトリストで弾くようにしてからは、APIまで到達する前に問題のあるファイルを止められるようになりました。サーバー側のログにもMIMEタイプを残しておくと、後から「どの形式で詰まったか」を集計でき、対応形式を増やす判断の材料になります。

SUPPORTED_IMAGE = {"image/png", "image/jpeg", "image/webp", "image/heic", "image/heif"}
 
def validate_image(mime_type: str) -> None:
    if mime_type not in SUPPORTED_IMAGE:
        raise ValueError(
            f"未対応の画像形式です: {mime_type}. "
            f"対応形式: {', '.join(sorted(SUPPORTED_IMAGE))}"
        )

エラーメッセージを「Gemini APIが拒否した」ではなく「この形式は未対応です」とユーザーの言葉に翻訳して返せると、サポート対応もぐっと楽になります。

まず試すなら、いま手元で Unsupported MIME type を出しているコードのMIMEタイプ文字列を print してみてください。image/jpg や application/octet-stream が出ていれば、原因はこの記事のどれかに当てはまるはずです。同じところで詰まっている方の手がかりになれば嬉しいです。

シェア

お読みいただきありがとうございます

Gemini Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

◈ API / SDK2026-04-27
Gemini API のファイル URI が突然 404 になる問題 — 48時間 TTL を前提にした設計の組み立て方
昨日まで動いていた Gemini API の画像/動画認識が、サーバー再起動後に急に動かなくなることがあります。原因は File API の48時間 TTL でした。検出方法と、TTL を前提にしたアプリ設計の組み立て方を実例で解説します。
◈ API / SDK2026-04-09
Gemini API のエラーを status で見分ける — 本番で止めない実装
Gemini API のエラーを HTTP status と finish_reason の2軸で切り分け、待つべきものと直すべきものを即断するための実装ノート。429 の3種類の上限、モデル廃止時のフォールバック、google-genai SDK 移行後の例外階層まで扱います。
◈ API / SDK2026-10-16
models は 200 なのに generateContent だけ 403 になる日 — 切り分けの順番を先に決めておく
モデル一覧の取得は 200 で通るのに、生成リクエストだけが 403 permission_denied で止まるときの切り分け手順です。キー・プロジェクト・請求の順に確かめる小さな診断スクリプトと、リトライしてはいけない理由、サポートへ渡す材料の揃え方をまとめました。