MIME(マイムタイプ)
MIME / MIME Type / Media Type
概要(サマリー)
MIME(マイム、MIMEタイプとも呼ばれる)は、Webやメールでやり取りされるデータが「どの種類のファイルなのか」を受け取る側に伝えるための識別情報である。
たとえばブラウザは、サーバーから届いたデータに text/html と書かれていればHTMLとして表示し、image/png と書かれていれば画像として扱う。荷物に貼られた「割れ物」「冷蔵」「書類」のラベルのように、中身を開く前に扱い方を判断するための目印だと考えるとわかりやすい。
なお、現在のWeb仕様では「メディアタイプ(media type)」という呼び方が正式とされている。ただし開発現場では今も「MIMEタイプ」という呼び名が広く使われており、本記事でも基本的にこちらを用いる。
詳細解説
MIMEとは何か
MIMEは「Multipurpose Internet Mail Extensions(多目的インターネットメール拡張)」の略である。
もともとは、文字中心だった電子メールで画像、音声、添付ファイル、日本語などの多言語テキストを扱えるようにするための仕組みとして作られた。現在ではメールだけでなく、Web通信でも「このデータは何の形式か」を伝える共通の考え方として使われている。
Webページを表示するとき、サーバーはブラウザへHTML、CSS、JavaScript、画像、JSONなど多くの種類のデータを返す。ブラウザは、そのデータが何なのかを判断できなければ、画面に表示すべきか、ダウンロードすべきか、プログラムとして読み込むべきかを決められない。そこでMIMEタイプが必要になる。
MIMEタイプの書き方
MIMEタイプは、原則として「タイプ/サブタイプ」という形で書く。
text/html
image/png
application/json
前半の text や image は大きな分類を表し、後半の html や png は具体的な形式を表す。かみ砕くと「文章系のHTML」「画像系のPNG」のような意味になる。
代表的なMIMEタイプには、次のようなものがある。
text/html: HTML文書text/css: CSSファイルtext/plain: プレーンテキストimage/png: PNG画像image/jpeg: JPEG画像image/svg+xml: SVG画像application/json: JSONデータapplication/pdf: PDFファイルapplication/octet-stream: 種類を特定しないバイナリデータ
application/octet-stream は「中身の種類を細かく指定しないデータ」として使われることが多い。ブラウザでは、そのまま表示するよりダウンロード扱いになることがある。
拡張子との違い
パソコン上では、ファイルの種類を .html や .png といった拡張子で判断することが多い。
しかしWeb通信では、URLに拡張子が付いていない場合もある。たとえば /api/users のようなURLは .json で終わっていないが、実際にはJSONを返すことがある。逆に、拡張子が見た目上は正しくても、サーバーが別の種類として送ってしまうこともある。
そのため、Webでは拡張子だけでなく、HTTPレスポンスの Content-Type ヘッダーが重要になる。ブラウザはこの情報を見て、受け取ったデータの扱い方を決める。
Content-Typeヘッダーの役割
Webサーバーがブラウザへデータを返すとき、レスポンスヘッダーに Content-Type を付ける。
Content-Type: text/html; charset=utf-8
これは「これから送るデータはUTF-8で書かれたHTML文書である」という意味である。ブラウザはこの情報をもとに、HTMLタグを解釈してWebページとして表示する。
もしHTMLを text/plain として返してしまうと、ブラウザはそれをただの文字列として扱い、タグを画面にそのまま表示することがある。反対に、JSON APIなのに text/html で返してしまうと、クライアント側の処理やデバッグがわかりにくくなる。
HTTPリクエストでも Content-Type は使われる。たとえばフォーム送信やAPIへのPOSTで、送信するデータがJSONなのか、フォームデータなのか、ファイルを含むデータなのかをサーバーに伝えるためである。
Content-Type: application/json
このヘッダーがない、または間違っていると、サーバー側がリクエスト本文を正しく読み取れないことがある。
文字コードを一緒に指定することがある
テキスト系のデータでは、MIMEタイプに加えて文字コードを指定することがある。
Content-Type: text/html; charset=utf-8
charset=utf-8 は「文字をUTF-8として解釈してほしい」という指定である。文字コードが適切に伝わらないと、日本語が文字化けする原因になる。
ただし、すべてのMIMEタイプに文字コード指定が必要なわけではない。画像やPDFのようなバイナリデータでは、通常 charset は付けない。
セキュリティ上の注意点
MIMEタイプは、セキュリティにも関係する。
たとえば本来は画像として扱うべきファイルを、誤ってHTMLやJavaScriptとしてブラウザに解釈させてしまうと、予期しないスクリプト実行につながる可能性がある。特に、ユーザーがアップロードしたファイルをそのまま公開する機能では注意が必要である。
ブラウザには、ファイルの中身を見て種類を推測する「MIMEスニッフィング」という挙動がある。便利な場面もあるが、セキュリティ上は意図しない解釈につながることがあるため、必要に応じて次のようなヘッダーで抑制する。
X-Content-Type-Options: nosniff
この指定は、サーバーが示した Content-Type をブラウザに尊重させ、勝手な推測を避けるために使われる。
AIコーディングとの関係
AIにWeb API、ファイル配信、アップロード機能、ダウンロード機能を作ってもらうとき、MIMEタイプの指定は重要な確認ポイントになる。
たとえば「CSVをダウンロードできるAPIを作って」とだけ指示すると、AIはファイル内容の生成までは書いてくれても、Content-Type や Content-Disposition の指定が不足することがある。実務では、ブラウザで開くのか、ダウンロードさせるのか、文字コードをどうするのかまで指定したほうがよい。
Node.jsのExpressでCSVファイルを返すAPIを作ってください。
レスポンスヘッダーには `Content-Type: text/csv; charset=utf-8` を設定し、
`Content-Disposition` で `report.csv` としてダウンロードされるようにしてください。
AIが生成したコードを確認するときは、次の点を見るとよい。
- 返すデータの種類に合ったMIMEタイプになっているか
- JSON APIが
application/jsonを返しているか - ファイルダウンロード時に
Content-Dispositionが必要か - 文字列データで文字コード指定が必要か
- アップロードファイルの検証を拡張子だけに頼っていないか
MIMEタイプは小さな設定に見えるが、ブラウザの動作、APIの扱いやすさ、セキュリティに影響する。AIの出力をそのまま使う前に、ヘッダーの意味を読めるようにしておくと不具合を見つけやすい。
よくある勘違い
拡張子さえ合っていれば、MIMEタイプは適当でいい?
拡張子だけでは不十分である。ローカルPCでは拡張子で判断される場面が多いが、Web通信では Content-Type が重要になる。
JavaScriptファイルを text/plain として返すと、ブラウザがスクリプトとして読み込まないことがある。画像、CSS、フォント、JSONでも同じように、MIMEタイプの誤りは表示崩れやAPIエラーの原因になる。
MIMEタイプは自分で自由に作ってよい?
基本的には、標準化・登録されているMIMEタイプを使うべきである。
独自形式を扱う場合も、既存の登録済みタイプで表せるならそれを使うほうがよい。どうしても独自の種類を表す必要がある場合は、組織内やアプリ内で意味を明確に決めて使う。ただし、ブラウザや他のソフトが自動的に正しく扱ってくれるとは限らない。
MIMEタイプはメールだけの仕組み?
名前の由来はメールだが、現在はWeb通信でも広く使われている。
メールの添付ファイル、Webページ、画像配信、APIレスポンス、ファイルアップロードなど、データの種類を伝える場面で使われる。初心者は「メールの古い仕組み」ではなく、「インターネット上のデータ種別ラベル」と考えると理解しやすい。
Content-Type はレスポンスだけに使う?
レスポンスだけでなく、リクエストでも使われる。
ブラウザやクライアントがサーバーへデータを送るとき、application/json、application/x-www-form-urlencoded、multipart/form-data などを指定する。サーバーはそれを見て、受け取った本文をどの方法で読み取るかを判断する。
まとめ
- MIMEタイプは、Webやメールでデータの種類を伝えるための識別情報である。
text/htmlやimage/pngのように「タイプ/サブタイプ」の形で書く。- Webでは
Content-Typeヘッダーとして使われ、ブラウザやサーバーの処理に影響する。 - 拡張子だけに頼ると、表示崩れ、APIエラー、セキュリティ上の問題につながることがある。
- AIが生成したWebコードでも、正しいMIMEタイプとヘッダー指定を確認することが重要である。
情報ソース
より詳しくAIに聞いてみよう
- MIMEタイプとは何かを、ブラウザがWebページを表示する流れに沿って説明してください。
- 拡張子とMIMEタイプの違いを、初心者向けに具体例つきで整理してください。
Content-Typeヘッダーが間違っていると、WebサイトやAPIでどんな不具合が起きるか教えてください。- AIコーディングでファイルアップロード機能を作るとき、MIMEタイプと拡張子をどう検証すべきか教えてください。
- AIにファイルダウンロードAPIを作ってもらうとき、MIMEタイプやレスポンスヘッダーを正しく指定するためのプロンプト例を作ってください。