MIME タイプ

MIME タイプはクライアントに対して、転送するドキュメントの種類を伝える機能です。ウェブにおいて、ファイル名の拡張子は意味を持ちません。従って、サーバーはそれぞれのドキュメントと共に正しい MIME タイプを転送するよう適切に設定することが重要です。ブラウザーはたいてい MIME タイプを、読み込んだリソースに対して行う既定のアクションを決めるために使用します。

さまざまな種類のドキュメントがありますので、MIME タイプも多数あります。この記事では、ウェブ開発でもっとも重要な MIME タイプを挙げますが、MIME タイプの完全な一覧 の記事で、ドキュメントの種類にあてはまる MIME タイプを探すことができます。

MIME タイプは、ドキュメントの種類の情報を伝える唯一の方法ではありません:

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

ウェブでは MIME タイプが唯一適切なものですので、注意深く設定しなければなりません。ブラウザーやサーバーは MIME タイプを定義する、整合性を確認する、あるいは汎用的なタイプしか提供されない場合に正しい MIME タイプを検出するために、拡張子やマジックナンバーを基にした検出法を使用することがよくあります。

構文

一般的な構造

type/subtype

MIME タイプの構造はとてもシンプルです。タイプとサブタイプの 2 種類の文字列で構成されており、それらは '/' で区切ります。空白は許可されていません。タイプ はカテゴリーを表しており、ディスクリートタイプやマルチパートタイプを使用できます。サブタイプは、それぞれのタイプを特定します。

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

ディスクリートタイプ

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

ディスクリートタイプはドキュメントのカテゴリーを示しており、以下のいずれかを使用できます:

タイプ 説明 代表的なサブタイプの例
text テキストを含んでおり、理論上は人間が読めるドキュメントを表します。 text/plain, text/html, text/css, text/javascript
image なんらかの種類の画像を表します。動画は含まれませんが、アニメーションする画像 (アニメーション GIF など) は画像のタイプで表します。 image/gif, image/png, image/jpeg, image/bmp, image/webp
audio なんらかの種類の音声ファイルを表します。 audio/midi, audio/mpeg, audio/webm, audio/ogg, audio/wav
video なんらかの種類の動画ファイルを表します。 video/webm, video/ogg
application なんらかの種類のバイナリーデータを表します。 application/octet-stream, application/pkcs12, application/vnd.mspowerpoint, application/xhtml+xml, application/xmlapplication/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 コンテンツは、このタイプで提供するべきです。application/xml+html など、XHTML 向けの新たな MIME タイプは、現在ではほぼ無用です (HTML5 がこれらの形式を統一しました)。

画像タイプ

少数の画像タイプだけが広く認識されるとともにウェブで問題が起きないと考えられており、ウェブページで使用できます:

MIME タイプ 画像タイプ
image/gif GIF 画像 (可逆圧縮、PNG が取って代わった)
image/jpeg JPEG 画像
image/png PNG 画像
image/svg+xml SVG 画像 (ベクター画像)

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

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

音声と動画のタイプ

画像と同様に、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 スニッフィングを抑制できます。

関連情報

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

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