PHP でファイルの MIME-Type を判別する方法
相変わらず、perlやPHPでファイルのダウンロード確認ダイアログを表示させる方法と、その関連記事であるperl の CGI や PHP でよく出力する Content-type ヘッダ一覧 (MIME-type)へのアクセスが、うちのブログでは毎日アクセス上位2位を占めているので、さらに補完エントリーを書いてみます。
ファイルをダウンロードさせるスクリプトを書く際に、最初からそのファイルの MIME-Type が解っている場合は良いのですが、色んな種類のファイルをひとつのスクリプトでダウンロードさせる場合には、各ファイル個別に MIME-Type を判別して、Content-type ヘッダとして出力する必要があります。
perl の場合は多分、自分で MIME-Type 判別用の関数を作るとか、何らかのモジュールを使うとか、perl スクリプトから file コマンドとかそれに類する UNIX コマンドを呼び出すとかしないと無理なんじゃないかと思うんですが、PHP の場合は非常に簡単で、mime_content_type() という関数一つで事足りるようです。
// MIME-Typeを判別したいファイル $source = '/home/tatsuya/data/img/00003.jpg'; // MIME-Type を判別 $mime_type = mime_content_type($source);
これで、「$mime_type」に、指定したファイルの MIME-Type が代入されます。
なので、perlやPHPでファイルのダウンロード確認ダイアログを表示させる方法で書いたようなダウンロードスクリプトを書く場合には、
// ダウンロードさせる元ファイル $source = '/home/tatsuya/data/img/00004.jpg'; // MIME-Type を判別 $mime_type = mime_content_type($source); // 保存時のファイル名 $filename = 'kagaminerin.jpg'; // HTTP ヘッダ送信 header("Content-type: {$mime_type}"); header("Content-Disposition: attachment; filename=\"{$filename}\""); // ファイルを読み込んで出力 readfile($source);
こんな感じになります。
後は、GET や POST で受け取った値を元に $source や $filename を変える処理を事前に作っておけばOKでしょう。
mime_content_type() 関数についての注意事項
PHP マニュアルの mime_content_type の項目を見ると、以下のように書いてあります。
この関数は非推奨です。PECL 拡張モジュール Fileinfo が、同等の機能 (それ以上のもの) をもっときれいな方法で提供しています。
ですので、PECL 拡張モジュールをインストールできる権限がある場合や、既にサーバーに Fileinfo 拡張モジュールが入っている場合は、この finfo_file 関数を使って MIME-Type を判別した方が良いかと思います。
- 関連するブログ記事
-
- カテゴリー
- PHP
- タグ
- Content-Disposition | Content-type | Fileinfo | finfo_file | HTTPヘッダ | MIME | mime_content_type | PECL拡張モジュール | PHP | RFC | ダウンロード
- 現在位置
- TOP > Web制作技術 > PHP > PHP でファイルの MIME-Type を判別する方法
- 前のブログ記事
- メール受信時に perl スクリプトを起動して自動処理させる方法 [2007年11月20日 10:46]
- 次のブログ記事
- ケータイの端末識別情報を取得する方法 [2007年11月22日 17:43]
コメント(6)
はじめまして!!
最近このブログを発見して随分と重宝してます。
実はPHP超初心者で毎日奮闘してまして(笑)、ここ数日GD関数を勉強中です・・・。
MIME-Typeがかなり参考になり、自分でMIME-Typeを判別して画像を縮小するスクリプトに挑戦してますが、
GIF・JPEG画像はうまくいくのですがPNG画像でひっかかるんです・・・。
imagepng()関数って何か使用するにあたって設定とか必要なんでしょうか?
もしよければ教えて下さい!
素人質問で申し訳ありません・・・。
> kenさん
コメントありがとうございます。
imagepng についてですが、僕自身はつまったことがないんですが、画像系なので色々と環境に依存しそうですね。
phpinfo で環境を確認されてみてはいかがでしょうか。
「PNG SUPPORT」の項目が disabled になってるようなら、imagepng は使えないかもしれませんね。
早速の返信ありがとうございます!
phpinfo()で確認してみたところ、enabledになってました・・・。
ちょっとソースを解析したいと思います・・・。
また、質問させて下さい!
ありがとうございました。
cgmkzgyr http://paydayloansusapqh.com/ payday loans
rzyitb http://paydayloansitg.com/ short term loans
ssekznf http://2012paydayloans.net/ payday loans
コメントする