PHPでマイムタイプを自動判別
PHPでファイルを読み込んで、そのまま出力するプログラムを書こうとしたのですが、マイムタイプの判別で躓いたのでメモ。
マイムタイプとはデータの形式を指定するためのもので、ブラウザにデータを渡す際に指定する必要があります。
具体的には、GIF画像なら
Content-Type: image/gif
Jpeg画像なら
Content-Type: image/jpeg
テキストなら
Content-Type: text/plain
などです。
今回はどんなファイルでも出力できるようにしたいのですが、マイムタイプは非常にたくさんあるので、上の内容を条件分岐させていくのは面倒です。
拡張子から簡単にマイムタイプを判別する方法は無いものか…と探していたら、以下の関数を発見。
ファイル名を与えると、image/gif
や text/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'];
?>
マイムタイプ定義部分が長いので、あとで自分で流用しやすいように全文を置いておきます。関数にして使いまわせるようにするといいかも。突っ込み歓迎。
ちなみに、マイムタイプと拡張子は Apache 2.0 の conf/mime.types
の内容を参考にしました。連想配列で定義しているだけなので、定義内容の編集は難しくないと思います。