MIME タイプは、文書の性質や形式を示すための標準化された方法です。 IETF RFC 6838 で定義及び標準化されています。 Internet Assigned Numbers Authority (IANA) がすべての公式な MIME タイプを追跡し続ける責任のある公式な主体であり、最新の完全なリストは Media Types ページで見ることができます。

ブラウザーは文書を処理する方法を決めるために (ファイルの拡張子ではなく) MIME タイプをよく使用します。従って、サーバーがレスポンスオブジェクトのヘッダーに正しく MIME タイプを割り当てるよう、正しく設定されていることが重要です。

構文

全般的な構造

type/subtype

MIME タイプの構造はとてもシンプルです。 '/' で区切られたタイプとサブタイプの二つの文字列で構成されます。タイプはカテゴリを表し、ディスクリート又はマルチパートタイプを使用できます。サブタイプは、それぞれのタイプに特有のものです。

MIME タイプは大文字・小文字を区別しませんが、伝統的にすべて小文字で記述します。

ディスクリートタイプ

text/plain
text/html
image/jpeg
image/png
audio/mpeg
audio/ogg
audio/*
video/mp4
application/*
application/json
application/javascript
application/ecmascript
application/octet-stream
…

ディスクリートタイプは文書のカテゴリを示しており、以下のいずれかを使用できます。

タイプ 説明 代表的なサブタイプの例
text テキストを含んでおり、理論上は人間が読める文書を表します。 text/plain, text/html, text/css, text/javascript
image なんらかの種類の画像を表します。動画は含まれませんが、アニメーションする画像 (アニメーション GIF など) は画像のタイプで表現されます。 image/gif, image/png, image/jpeg, image/bmp, image/webp, image/x-icon, image/vnd.microsoft.icon
audio なんらかの種類の音声ファイルを表します。 audio/midi, audio/mpeg, audio/webm, audio/ogg, audio/wav
video なんらかの種類の動画ファイルを表します。 video/webm, video/ogg
application なんらかの種類のバイナリデータを表します。 application/javascript, application/octet-stream, application/pkcs12, application/vnd.mspowerpoint, application/xhtml+xml, application/xml, application/pdf

特定のサブタイプを持たないテキスト形式文書は、 text/plain を使用するべきです。同様に特定の、あるいは既知のサブタイプを持たないバイナリ形式文書は、 application/octet-stream を使用するべきです。

マルチパートタイプ

multipart/form-data
multipart/byteranges

マルチパートタイプは、複数の部品に分割される文書のカテゴリであり、多くは異なる MIME タイプを持ちます。これは複合文書を表す方法です。 HTML フォーム及び POST メソッドの関係で使用される multipart/form-data や、文書全体のサブセットのみ送信するための 206 Partial Content ステータスメッセージとの組み合わせで使用される multipart/byteranges を除いて、 HTTP はマルチパートの文書を特定の方法で扱いません。メッセージは単純にブラウザーへ送信されます (おそらく文書をインラインで表示する方法がわからず、名前を付けて保存することを提案されるでしょう)。

ウェブ開発者向けの重要な MIME タイプ

application/octet-stream

これは、バイナリ形式ファイル用の既定値です。実際は未知のバイナリ形式ファイルを表しており、通常ブラウザーは自動的に実行したり、実行すべきであるかを確認したりしません。これらは Content-Disposition ヘッダーの値が attachment であるかのように扱い、ファイルを '名前を付けて保存' することを提案します。

text/plain

これは、テキスト形式ファイルの既定の値です。実際は未知のテキスト形式ファイルを表しているとしても、ブラウザーはファイルを表示しようとします。

text/plain任意のテキスト形式データを表すものではありませんので注意してください。特定の種類のテキスト形式データを想定している場合は、おそらくそのとおりに判断されないでしょう。特に、CSS ファイルを宣言する <link> 要素から text/plain 形式のファイルをダウンロードすると、text/plain で示されたファイルは正しい CSS ファイルであると認識されません。CSS の MIME タイプである text/css を使用しなければなりません。

text/css

ウェブページで CSS として解釈されなければならない、あらゆる CSS ファイルは text/css のファイルであることが必須です。たいていのサーバーは拡張子が .css であるファイルを CSS ファイルであるとは認識せず、text/plain または application/octet-stream MIME タイプを送信します。この場合、ほとんどのブラウザで CSS ファイルとは認識されず、暗黙的に無視されます。正しいタイプで CSS ファイルを提供するため、特に注意を払わなければなりません。

text/html

すべての HTML コンテンツは、このタイプで提供するべきです。 XHTML 向けの新たな MIME タイプ (application/xhtml+xml など) は、現在ではほぼ無用です (HTML5 がこれらの形式を統一しました)。

メモ: text/html の解釈時の意味は application/xml のものと互換性がないため、 XML の厳密な解釈規則を使用したり、 <![CDATA[…]]> や HTML でも SVG でも MathML でもない XML 名前空間の要素を使用したりする必要がある場合は、 application/xml または application/xhtml+xml を使用する必要があります。

JavaScript タイプ

MIME スニッフィング標準によれば、以下のものはすべて有効な JavaScript の MIME タイプです。

  • application/javascript
  • application/ecmascript
  • application/x-ecmascript
  • application/x-javascript
  • text/ecmascript
  • text/javascript
  • text/javascript1.0
  • text/javascript1.1
  • text/javascript1.2
  • text/javascript1.3
  • text/javascript1.4
  • text/javascript1.5
  • text/jscript
  • text/livescript
  • text/x-ecmascript
  • text/x-javascript

text の JavaScript タイプはすべて RFC 4329 で非推奨になりました。

画像タイプ

広く認識されており、ウェブで安全、ウェブページで使用できると考えられている画像タイプはわずかしかありません。

MIME タイプ 画像タイプ
image/gif GIF 画像 (可逆圧縮、PNG が取って代わった)
image/jpeg JPEG 画像
image/png PNG 画像
image/svg+xml SVG 画像 (ベクター画像)
image/x-icon, image/vnd.microsoft.icon[1] Windows アイコン

WebP (image/webp) をこの一覧に加えるかという議論がありますが、新しい画像タイプはコードベースの増大を招き、新たなセキュリティの問題が発生する可能性があるため、ブラウザーベンダーはそれを受け入れることに慎重です。

他の種類の画像もウェブ文書で見受けられるでしょう。例えば、多くのブラウザが favicon などのためのアイコン画像タイプをサポートしています。特に ICO 画像は、このような状況で image/x-icon MIME タイプでサポートされています。

脚注 1
image/vnd.microsoft.iconIANA に登録されているにもかかわらず、広く対応されておらず、代わりに image/x-icon が使用されています。

音声と動画のタイプ

画像と同様に、 HTML は <audio><video> 要素での使用をサポートする形式を定義していませんので、ウェブで使用できる形式のグループは比較的小さなものです。 HTML5 の audio 要素と video 要素でサポートされているメディアフォーマットで、使用可能なコーデックやコンテナーを説明しています。

これらのファイルの MIME タイプはたいていコンテナー形式を表しており、ウェブでもっとも一般的なものは以下のとおりです。

MIME タイプ 音声または動画のタイプ
audio/wave
audio/wav
audio/x-wav
audio/x-pn-wav
WAVE コンテナー形式の音声ファイル。PCM オーディオコーデック (WAVE コーデック "1") はたいていサポートされていますが、他のコーデックのサポートは (あるとしても) 限定的です。
audio/webm WebM コンテナー形式の音声ファイル。Vorbis や Opus がもっとも一般的な音声コーデックです。
video/webm WebM コンテナー形式の、おそらく音声も含む動画ファイル。VP8 や VP9 がもっとも一般的に使用される動画コーデック、また Vorbis や Opus がもっとも一般的な音声コーデックです。
audio/ogg OGG コンテナー形式の音声ファイル。Vorbis が、このコンテナーでもっとも一般的に使用される音声コーデックです。
video/ogg OGG コンテナー形式の、おそらく音声も含む動画ファイル。通常の動画コーデックは Theora、音声コーデックは Vorbis です。
application/ogg OGG コンテナー形式を使用する音声または動画のファイル。通常の動画コーデックは Theora、音声コーデックは Vorbis です。

multipart/form-data

multipart/form-data タイプは、入力済みの HTML フォーム の内容をブラウザーからサーバーに送信するときに使用できます。正式なマルチパートの文書のようにさまざまな部品で構成されており、境界 (二重ダッシュ '--' で始まる文字列) によって区切られます。。それぞれの部品自体がエンティティであり、固有の HTTP ヘッダーとして Content-Disposition やファイルアップロードのフィールド用に Content-Type、さらにごく一般的なヘッダーを伴います (境界線を区切り文字として使用するため、Content-Length は無視されます)。

Content-Type: multipart/form-data; boundary=aBoundaryString
(マルチパート文書全体に関連付けられる、他のヘッダー)

--aBoundaryString
Content-Disposition: form-data; name="myFile"; filename="img.jpg"
Content-Type: image/jpeg

(データ)
--aBoundaryString
Content-Disposition: form-data; name="myField"

(データ)
--aBoundaryString
(サブパート)
--aBoundaryString--

以下のフォームがあるとします。

<form action="http://localhost:8000/" method="post" enctype="multipart/form-data">
  <input type="text" name="myTextField">
  <input type="checkbox" name="myCheckBox">Check</input>
  <input type="file" name="myFile">
  <button>Send the file</button>
</form>

これは以下のメッセージを送信します。

POST / HTTP/1.1
Host: localhost:8000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Content-Type: multipart/form-data; boundary=---------------------------8721656041911415653955004498
Content-Length: 465

-----------------------------8721656041911415653955004498
Content-Disposition: form-data; name="myTextField"

Test
-----------------------------8721656041911415653955004498
Content-Disposition: form-data; name="myCheckBox"

on
-----------------------------8721656041911415653955004498
Content-Disposition: form-data; name="myFile"; filename="test.txt"
Content-Type: text/plain

Simple file.
-----------------------------8721656041911415653955004498--

multipart/byteranges

multipart/byteranges MIME タイプは、部分的なレスポンスをブラウザーへ返す状況で使用します。206 Partial Content ステータスコードを送信するとき、この MIME タイプは文書がいくつかの部品で構成されることを示しており、それぞれのリクエストされた範囲のひとつになります。ほかのマルチパートのタイプと同様に、境界の文字列を定義するために Content-Typeboundary ディレクティブを使用します。それぞれの文書部品は文書の実際のタイプを表す Content-Type ヘッダーと、提供する範囲を表す Content-Range ヘッダーを持ちます。

HTTP/1.1 206 Partial Content
Accept-Ranges: bytes
Content-Type: multipart/byteranges; boundary=3d6b6a416f9b5
Content-Length: 385

--3d6b6a416f9b5
Content-Type: text/html
Content-Range: bytes 100-200/1270

eta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="vieport" content
--3d6b6a416f9b5
Content-Type: text/html
Content-Range: bytes 300-400/1270

-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: "Open Sans", "Helvetica
--3d6b6a416f9b5--

正しい MIME タイプを設定することの重要性

多くのウェブサーバーは未知の種類のリソースについて、既定の application/octet-stream MIME タイプを送ります。セキュリティ上の理由で、多くのブラウザーはこのようなリソースに既定のアクションを定義することを許可せず、リソースを使用するためにディスクへ保存することをユーザーに強制します。以下のファイルタイプで、誤ったサーバー設定がよく見られます。

  • RAR で符号化されたファイル。この場合、符号化されたファイルの実際の種類を設定できることが理想です。しかしこれはたいていの場合できません (サーバーがそれを知ることができず、またこれらのファイルは種類が異なる複数のファイルを含むためです)。この場合、サーバーは application/x-rar-compressed MIME タイプを送信するように設定します。そうしなければ、ユーザーがそれらのファイルに対して、既定の有用なアクションを定義できなくなるでしょう。

  • 音声および動画のファイル。正しい MIME タイプを持つリソースだけが、 <video> または <audio> 要素で認識および再生されます。音声および動画に対して正しい MIME タイプを使用するよう注意してください。

  • プロプライエタリーなファイルタイプ。プロプライエタリーなファイルタイプを提供するときは、特に注意が必要です。特別な操作ができなくなるため、application/octet-stream の使用は避けてください。ほとんどのブラウザーは、この汎用的な MIME タイプに既定の動作 ("Word で開く" など) を定義できません。

MIME スニッフィング

MIME タイプが欠落している、あるいは MIME タイプが誤って設定されているとクライアントが考えている場合に、ブラウザーは MIME スニッフィングを行います。これは、リソースを確認して正しい MIME タイプを推測します。それぞれのブラウザーはこれを異なる方法で、またさまざまな状況下で実行します。実行可能なコンテンツを表す MIME タイプやそうでない MIME タイプが存在するため、この方法にはセキュリティ上の懸念が多少あります。サーバーは Content-Type と共に X-Content-Type-Options を送信して、MIME スニッフィングを抑制できます。

文書形式を伝える他の方法

MIME タイプは、文書の種類の情報を伝える唯一の方法ではありません。

  • 特に Microsoft Windows のシステムでは、ファイル名の拡張子を使用することがあります。拡張子に意味があるとは考えないオペレーティングシステムもあります (特に Linux や Mac OS)。また外部の MIME タイプと同様に、それらが正しいという保証はありません。
  • マジックナンバー。さまざまな種類のファイルの構文で、その構造を見ることで種類を特定できるようになっています。例えば GIF ファイルは16進数の値 47 49 46 38 39、 PNG ファイルは 89 50 4E 47 [.PNG] で始まります。マジックナンバーを持たない種類のファイルもありますので、100%信頼できるシステムではありません。

関連情報

ドキュメントのタグと貢献者

このページの貢献者: mfuji09, yyss
最終更新者: mfuji09,