エントリー

PHPでマイムタイプを自動判別

PHPでファイルを読み込んで、そのまま出力するプログラムを書こうとしたのですが、マイムタイプの判別で躓いたのでメモ。

マイムタイプとはデータの形式を指定するためのもので、ブラウザにデータを渡す際に指定する必要があります。
具体的には、GIF画像なら

Content-Type: image/gif

Jpeg画像なら

Content-Type: image/jpeg

テキストなら

Content-Type: text/plain

などです。
今回はどんなファイルでも出力できるようにしたいのですが、マイムタイプは非常にたくさんあるので、上の内容を条件分岐させていくのは面倒です。

拡張子から簡単にマイムタイプを判別する方法は無いものか…と探していたら、以下の関数を発見。

mime_content_type

ファイル名を与えると、image/giftext/plain という値を返してくれるそうです。これは便利!と思ったら、この関数の利用は非推奨だそうです。実際、環境によっては利用できません…。

代わりにPECL拡張モジュールを使うといいらしいですが、やっぱり利用できない環境があります。PEARを使って判別することもできるらしいですが、できればPEARは使いたくないです。(freoではPEARを一切使わない方針なので。)

…という訳で、いい方法を見つけられなかったので「拡張子からマイムタイプを自動判別する」処理を自作してみた。結局ものすごく露骨な処理になりましたが、あらかじめ拡張子とマイムタイプを定義しておくだけです。

<?php

//マイムタイプ定義
$mime_content_types = array(
  'ez'      => 'application/andrew-inset',
  'atom'    => 'application/atom+xml',
  'atomcat' => 'application/atomcat+xml',
  ~略~
  'avi'     => 'video/x-msvideo',
  'movie'   => 'video/x-sgi-movie',
  'ice'     => 'x-conference/x-cooltalk'
);

//GIF画像ファイルのマイムタイプを出力
echo $mime_content_types['gif'];

//テキストファイルのマイムタイプを出力
echo $mime_content_types['txt'];

?>

マイムタイプ定義部分が長いので、あとで自分で流用しやすいように全文を置いておきます。関数にして使いまわせるようにするといいかも。突っ込み歓迎。

php_mime.txt

ちなみに、マイムタイプと拡張子は Apache 2.0 の conf/mime.types の内容を参考にしました。連想配列で定義しているだけなので、定義内容の編集は難しくないと思います。

ページ移動

ユーティリティ

カテゴリー

検索

エントリー検索フォーム
キーワード

過去ログ

過去ログ表示フォーム
キーワード

Feed