読者です 読者をやめる 読者になる 読者になる

Fileinfo拡張を使う

PHP

PHPでファイルのContent Typeを調べる方法としては、mime_content_typeを使うといった手段がありますが、Mimetype 関数Pのリファレンスには、

この拡張モジュールは廃止予定です。PECL の Fileinfo 拡張モジュールが、同等の機能(に加えてそれ以上の機能)を よりきれいな方法で提供しています。

とあります。そこで、Fileinfo拡張をインストールして試してみることにしました。


インストールは、pear/peclコマンドを使って簡単に行えます。

pear install pecl/fileinfo

または

pecl install fileinfo

インストール後、扱う機会の多いファイルのContent-Typeが、Fileinfo拡張で、どのように判定されるか調べてみました。

テキスト文書(EUC-JP) text/x-c++; charset=iso-8859-1
テキスト文書(UTF-8) text/x-c++; charset=utf-8
テキスト文書(Shift_JIS) text/x-c++; charset=unknown
PDF application/pdf
CSV text/plain; charset=unknown
Excel(xls) application/msword
Word application/msword
jpeg image/jpeg
gif image/gif
png image/png


日本語の文書のエンコーディング判定の結果はあまり芳しくありません。
今回は、Fileinfoをインストールして試してみましたが、Fileinfoを使わなくても、fileコマンドを呼んでやれば、全く同じ結果を取得できます。

$ file -bi some/file.txt

実際、PEARのMIME_Typeは、mime_content_typeが利用可能であれば、それを使ってContent-Typeを判定し、なければfileをexecする、ということをやってくれます。


現実には、クライアントへの応答としてファイルを出力する際には、拡張子など元にアプリケーション側で独自に対応、要求(ファイルアップロード)を処理するときには、Content-Typeではなく、中身を見て判断することがほとんどでしょうから、あまり使う機会もなさそうです。
もちろん、画像ファイルを扱う場合はGDを使うのがスタンダードなやり方でしょう。