コンテンツにスキップ

MIMEタイプ一覧

ファイルの種類を示すMIMEタイプ(メディアタイプ)の一覧表です。Webサーバーの設定、Content-Typeヘッダーの指定、ファイルアップロードのバリデーションなどの開発作業にお役立てください。

MIMEタイプとは

MIME(Multipurpose Internet Mail Extensions)タイプは、ファイルの形式や性質を識別するための標準的な仕組みです。タイプ/サブタイプの形式で表記され、Webブラウザやサーバーがファイルの処理方法を判断するために使用されます。HTTPレスポンスのContent-Typeヘッダーや、HTMLの<input type="file" accept="...">属性などで指定します。

画像(image)

拡張子 MIMEタイプ 説明
.jpg / .jpegimage/jpegJPEG画像。写真に最適な非可逆圧縮形式
.pngimage/pngPNG画像。透過対応の可逆圧縮形式
.gifimage/gifGIF画像。アニメーション対応、256色まで
.webpimage/webpWebP画像。Google開発の高圧縮形式
.avifimage/avifAVIF画像。AV1ベースの次世代形式
.svgimage/svg+xmlSVGベクター画像。XMLベース
.icoimage/x-iconアイコンファイル。favicon等に使用
.bmpimage/bmpビットマップ画像。無圧縮
.tiff / .tifimage/tiffTIFF画像。印刷・DTPで使用

ドキュメント(application)

拡張子 MIMEタイプ 説明
.pdfapplication/pdfPDF文書
.docapplication/mswordMicrosoft Word(旧形式)
.docxapplication/vnd.openxmlformats-officedocument.wordprocessingml.documentMicrosoft Word(OOXML形式)
.xlsapplication/vnd.ms-excelMicrosoft Excel(旧形式)
.xlsxapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetMicrosoft Excel(OOXML形式)
.pptapplication/vnd.ms-powerpointMicrosoft PowerPoint(旧形式)
.pptxapplication/vnd.openxmlformats-officedocument.presentationml.presentationMicrosoft PowerPoint(OOXML形式)

テキスト(text)

拡張子 MIMEタイプ 説明
.txttext/plainプレーンテキスト
.html / .htmtext/htmlHTML文書
.csstext/cssCSSスタイルシート
.csvtext/csvカンマ区切りテキスト
.xmltext/xmlXML文書
.jstext/javascriptJavaScript(application/javascriptも有効)
.jsonapplication/jsonJSONデータ
.mdtext/markdownMarkdownテキスト

音声(audio)

拡張子 MIMEタイプ 説明
.mp3audio/mpegMP3音声。最も普及した音声形式
.wavaudio/wavWAV音声。無圧縮PCM
.oggaudio/oggOgg Vorbis音声
.flacaudio/flacFLAC音声。可逆圧縮
.aacaudio/aacAAC音声。MP3の後継
.webmaudio/webmWebM音声
.m4aaudio/mp4MPEG-4音声

動画(video)

拡張子 MIMEタイプ 説明
.mp4video/mp4MP4動画。最も普及した動画形式
.webmvideo/webmWebM動画。Web向けオープン形式
.avivideo/x-msvideoAVI動画
.movvideo/quicktimeQuickTime動画
.mkvvideo/x-matroskaMatroska動画コンテナ
.mpegvideo/mpegMPEG動画

アーカイブ・圧縮(application)

拡張子 MIMEタイプ 説明
.zipapplication/zipZIP圧縮アーカイブ
.gz / .gzipapplication/gzipGzip圧縮ファイル
.tarapplication/x-tartarアーカイブ
.tar.gzapplication/gziptar+gzip圧縮アーカイブ
.rarapplication/vnd.rarRAR圧縮アーカイブ
.7zapplication/x-7z-compressed7-Zip圧縮アーカイブ
.bz2application/x-bzip2Bzip2圧縮ファイル

フォント(font)

拡張子 MIMEタイプ 説明
.wofffont/woffWeb Open Font Format
.woff2font/woff2WOFF2。圧縮率が向上
.ttffont/ttfTrueTypeフォント
.otffont/otfOpenTypeフォント

その他

拡張子 MIMEタイプ 説明
(不明)application/octet-streamバイナリデータ(汎用)。不明な形式のデフォルト
.wasmapplication/wasmWebAssemblyバイナリ

開発でのMIMEタイプの使い方

サーバー側の設定

Webサーバー(Apache / Nginx)では、ファイル拡張子とMIMEタイプの対応を設定します。正しく設定しないと、ブラウザがファイルを正しく処理できない場合があります。例えば.webpファイルに正しいMIMEタイプが設定されていないと、画像として表示されずダウンロードされてしまうことがあります。

ファイルアップロードのバリデーション

ファイルアップロード機能を実装する際は、拡張子だけでなくMIMEタイプも検証することが重要です。ただし、MIMEタイプはクライアント側で偽装可能なため、セキュリティ上はマジックバイト(ファイル先頭のバイト列)による検証も併用することを推奨します。

Content-Typeヘッダー

APIレスポンスやファイルダウンロード時には、適切なContent-Typeヘッダーを設定しましょう。JSONデータにはapplication/json、CSVファイルにはtext/csvを指定します。文字コード指定が必要な場合はtext/html; charset=utf-8のようにcharsetパラメータを付加します。

サーバー設定での MIME タイプ指定

WebP / AVIF / WASM / フォントなど、サーバーのデフォルトマッピングに含まれていないことが多い現代的なフォーマットを配信するときに、よく使うスニペットを以下に示します。

Apache .htaccess

# 現代的な画像フォーマット
AddType image/webp .webp
AddType image/avif .avif
AddType image/svg+xml .svg .svgz

# フォント(積極的にキャッシュさせる)
AddType font/woff  .woff
AddType font/woff2 .woff2

# WebAssembly & モダンな JSON バリアント
AddType application/wasm        .wasm
AddType application/manifest+json .webmanifest
AddType application/ld+json     .jsonld

# テキスト系を UTF-8 で配信
AddCharset utf-8 .html .css .js .json .xml

Nginx (mime.types 上書き)

types {
    image/webp                webp;
    image/avif                avif;
    application/wasm          wasm;
    application/manifest+json webmanifest;
}

# text/* と application/json に文字コードを強制
charset utf-8;
charset_types text/css text/plain text/xml application/javascript application/json application/xml;

PHP — Content-Type の送出

// ファイル名付きで PDF をダウンロードさせる
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="invoice.pdf"');
readfile($path);

// JSON API レスポンス (charset は常に明示)
header('Content-Type: application/json; charset=utf-8');
echo json_encode($data, JSON_UNESCAPED_UNICODE);

Node.js / Express

// Express は res.type() か拡張子から Content-Type を推測する
app.get('/data.json', (req, res) => {
    res.type('application/json').send({ ok: true });
});

// 明示的な MIME 指定でファイルストリーミング
app.get('/report.csv', (req, res) => {
    res.set('Content-Type', 'text/csv; charset=utf-8');
    fs.createReadStream('report.csv').pipe(res);
});

Python — Flask / FastAPI

# Flask
from flask import Response
return Response(csv_text, mimetype='text/csv', headers={'Content-Disposition': 'attachment; filename="data.csv"'})

# FastAPI
from fastapi.responses import Response
return Response(content=json_str, media_type='application/json')

Go — net/http

w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.Header().Set("X-Content-Type-Options", "nosniff")  // セキュリティ: 下記参照
json.NewEncoder(w).Encode(data)

セキュリティ: なぜ X-Content-Type-Options: nosniff が必要か

ブラウザは歴史的に、Content-Type ヘッダーが欠落・誤指定されていたときにファイル内容を「スニッフィング」して種類を推測していました。これは既知の攻撃ベクターで、image/jpeg としてアップロードされたファイルの中身が実は <script> を含む HTML だった場合、ブラウザが HTML としてスニッフィングして XSS を発生させてしまう可能性があります。

全レスポンスで X-Content-Type-Options: nosniff を必ず送出してください。「サーバーが指定した Content-Type を信じろ、推測するな」とブラウザに伝えるヘッダーです。ユーザーアップロードファイルや JSON API では特に必須です (悪意あるリクエストで JSON を HTML や JS と解釈させようとする攻撃がある)。

アップロード検証 — 3 層ルール

  1. 拡張子チェック — 高速だがファイルをリネームするだけで突破される。UX 上のヒント程度として使う。
  2. クライアントが送信する MIME タイプ(multipart 境界内の Content-Type)— 同様に偽装が容易。ブラウザはファイル拡張子から決定しているだけ。
  3. マジックバイト(ファイル署名)検出 — 実際のファイル先頭バイトを読み、既知のシグネチャ (JPEG なら FF D8 FF、PNG なら 89 50 4E 47) と照合する。**これだけが信頼できる層**。詳細は マジックバイトリファレンス を参照。

実運用の鉄則: **3 つすべて実施する**。最初の 2 つは明らかなゴミを弾く高速フィルタとして、3 つ目を権威ある最終チェックとして扱う。

よくある質問

application/jsontext/json の違いは?

application/jsonRFC 8259 で定義された IANA 登録済みの正式な MIME タイプです。text/json は初期に一部サーバーで使われた非公式な表記で、未登録のため使用は避けるべきです。JSON は仕様上 UTF-8 でエンコードされるため charset パラメータは技術的には冗長ですが、明示する分には無害です。

.webp.avif がブラウザで表示されずダウンロードされてしまう

サーバーがその拡張子のマッピングを持っておらず、application/octet-stream にフォールバックしているのが原因です。ブラウザは「未知のバイナリだからダウンロードする」と判断します。image/webp / image/avif のマッピングを Apache / Nginx 設定に追加してください (上記スニペット参照)。

ブラウザが送信する MIME タイプはアップロード検証で信頼できる?

いいえ。ブラウザは選択時のファイル拡張子から MIME を決定するだけなので、malware.execute-cat.jpg にリネームすればブラウザは素直に image/jpeg と表示します。拡張子 + クライアント MIME + マジックバイト検出の 3 層を必ず組み合わせてください。

サーバーが認識しないファイルにはどの MIME を使えばいい?

application/octet-stream。「任意のバイナリデータ」として明示的に定義されており、安全なデフォルトです。ブラウザは描画を試みず、ダウンロード提示するため、誤実行を防げます。

application/x-www-form-urlencodedx- プレフィックスは何?

歴史的に x- は「実験的 / 非標準」を表す慣習でした。RFC 6648 (2012) で廃止されましたが、application/x-www-form-urlencoded / image/x-icon / application/x-tar など広く普及しているタイプは後方互換のためプレフィックスが残されています。

画像や PDF などバイナリ系にも charset を付けるべき?

不要です。charset はテキスト系 (text/*application/jsonapplication/xml) にだけ意味があります。image/jpegapplication/pdf に付けても無意味で、一部の中継 (CDN、プロキシ) で削除される場合があります。