無料スクリプトならphp.to

PHPスクリプト無料配布所 :: PHP.TO







アクセスアップ・上位表示ならSEO.CUG.NET
安くて早い!SEOに強いコーディング代行サイト AcodeZ(アコーズ)
無料スクリプトならphp.to PHPスクリプト無料配布!php.to
リンクはご自由に


0005. MIME-typeを定義する方法
<< 0004. 一括して入力パラメータのサニタイジングを行う方法
アップロードされたファイルの形式をPHPで判定したり、ファイルをダウンロードまたはメールに添付して送信する際のContent-Typeのために、MIME-typeWikipediaによるMIME-type情報を参照 の定義を行うことは欠かせません。

ファイルアップロードの際は、基本的に連想配列 $_FILES['変数名']['type'] の中に自動的に入ってくれるので、あまり気にする必要はありません。

問題はダウンロードなどのときで、このときはダウンロードさせるファイルに合った形式のMIME-typeをContent-Typeヘッダとともに返してやる必要があります。
このMIME-typeをPHPで定義する方法は下記のように、いくつか存在します。

  1. PEARのFileinfoパッケージを用いる方法

  2. mime_content_type()関数を使う方法

  3. 自力でファイル名の拡張子に応じて判定する方法



それぞれの利点・欠点などを説明します。

1. PECLのFileinfoパッケージを用いる方法

FileinfoパッケージFileinfoパッケージのマニュアルへ はPECLによる同パッケージのインストールが必要です。
(PHPマニュアルにはPEARPEARの情報へ となっていますが、実際にはPECLPECLの情報へ です)
同パッケージがインストールされている、またはインストールできる環境であるなら、最も簡単にfinfo_file()finfo_file()のマニュアルへ を用いてMIME-typeを得ることができます。
なお、このパッケージは内部で libmagic を呼んでいるだけです。同パッケージのインストール後は、コンパイルされたモジュールをphp.iniでextention = /path/to/fileinfo.so のように指定するか、動的にロードする必要があります。
具体的な使用方法は、0006. ファイルを添付してメールを送信する方法を参照してください。

この関数で検出できるMIME-typeは「確実」ではありませんが、多くのファイル形式を含んだデータベースファイルの中から特定のバイナリ文字列をサーチして判定しており、後に述べる2つの形式に比べて、遥かに高い精度での自動検出が可能です。
詳細は、O'REILLY JAPANから発行されている「BINARY HACKS」などの文献を参考にしてください。



2. mime_content_type()関数を使う方法

mime_content_type()mime_content_type()のマニュアルへ 関数を使う場合は、PHPのconfigure時に --with-mime-magic オプションの追加が必要であり、Windows環境やApache以外のhttpdを使っている場合は、php.ini内の mime_magic.magicfile ディレクティブに maginc.mime ファイルへのpathが必要です。
この関数はApacheの設定ファイルの一つである mime.typesファイル (またはMimeMagicFileディレクティブで定義されたファイル)mime.typesファイル (またはMimeMagicFileディレクティブで定義されたファイル)のマニュアルへ を利用してMIME-typeの自動判定を行います。
特定のバージョンでしか使用できず、将来的に廃止予定の関数であるのに加え、ここに定義されていないファイル形式はFileinfoパッケージのように自力でバイナリ構造を調べて設定ファイルに追記する必要があるので、まず使うことはないでしょう。



3. 自力でファイル名の拡張子に応じて判定する方法

自力でファイル名の拡張子から判定する方法としては、例えば下記のようなコードで実現することができます。
ただし、これはあくまでファイル名の拡張子を元に単純な判定を行っているだけですので、前述の2つの判定方式に比べて確実性は大きく劣ります。
前述の2つの方式が使えない環境でのみ使用すべきでしょう。

なお、特にMIME-typeの指定は必要ないがダウンロードだけはさせたい場合などでは、単純に Content-Type: application/octet-stream と指定するのが最も実用的です。
これは、「ファイルの形式は分からないものの、中身はバイナリである」という意味になりますので、通常のブラウザであれば勝手にMIME-typeに紐付けられたアプリケーションが起動することなく、ダウンロードダイアログを開いてくれます。
(MS-Officeなどが入っている環境では、MIME-typeを無視してダウンロードする拡張子に応じて勝手に起動したりすることがあるようなので、この限りではありませんが・・・)




<?php
    
// 拡張子でMIME-typeを判定してみる例
    
    // 必要に応じて、自分が利用したいMIME-typeを追加してください
    
$aContentTypes = array(
        
'txt'=>'text/plain',
        
'htm'=>'text/html',
        
'html'=>'text/html',
        
'jpg'=>'image/jpeg',
        
'jpeg'=>'image/jpeg',
        
'gif'=>'image/gif',
        
'png'=>'image/png',
        
'bmp'=>'image/x-bmp',
        
'ai'=>'application/postscript',
        
'psd'=>'image/x-photoshop',
        
'eps'=>'application/postscript',
        
'pdf'=>'application/pdf',
        
'swf'=>'application/x-shockwave-flash',
        
'lzh'=>'application/x-lha-compressed',
        
'zip'=>'application/x-zip-compressed',
        
'sit'=>'application/x-stuffit'
    
);

    
// 拡張子からMimeTypeを設定
    
function getMimeType($filename) {
        global 
$aContentTypes;
        
$sContentType 'application/octet-stream';
        
        if ((
$pos strrpos($filename".")) !== false) {
            
// 拡張子がある場合
            
$ext strtolower(substr($filename$pos+1));
            if (
strlen($ext)) {
                return 
$aContentTypes[$ext]?$aContentTypes[$ext]:$sContentType;
            }
        }
        return 
$sContentType;
    }

    
//
    
$filename "sample.jpg";
    echo 
"$filename のMIME-typeは、<i>".getMimeType($filename) . "</i> です";


?>

⇒ 実行結果








>> 0006. ファイルを添付してメールを送信する方法
track back URL : http://php.to/tips/5/trackback/

コメント

コメントはまだありません


よろしければコメントをどうぞ ※spam防止のため、半角英数字のみの投稿はできません
お名前(必須):
URL:
コメント(必須):

パソコンメーカーのデル
XPS 15z
Vostro 3750

- SEO.CUG.NET :: スクリプト配布チーム -