HOME >> Tips >> PHP

ファイルのMIMEタイプを取得して拡張子を判断する方法

2017/8/6
文書番号:20769


PHP でファイルをアップロードする処理の中で、そのファイルの拡張子を取得したいことがありました。

拡張子を取得する方法として「$_FILES」変数からファイル名を取得してその拡張子を取得することもできますが、 これはブラウザ側で偽造できるので、ファイルのMIMEタイプを取得してそこから判断してみたいと思います。


まずはMIMEタイプを取得するサンプルです。


//MIMEタイプを取得
$finfo  = finfo_open(FILEINFO_MIME_TYPE);
$mime_type = finfo_file($finfo, $_FILES['upfile']['tmp_name']);
finfo_close($finfo);

echo $mime_type;

サンプル(PHP 5.3以降の場合はこちらも可)

//MIMEタイプを取得
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime_type = $finfo->file($_FILES['upfile']['tmp_name']);

echo $mime_type;

取得したMIMEタイプから拡張子を判断します。
想定しない(許可しない)ファイルタイプのものを選択したときはこのチェックではじくようにできます。

$ext = "";
switch ($mime_type) {
    case "image/png":
        $ext = "png";
        break;
    case "image/jpeg":
        $ext = "jpg";
        break;
    case "image/gif":
        $ext = "gif";
        break;
    case "application/pdf":
        $ext = "pdf";
        break;
    default:
        throw new RuntimeException('許可されていないファイルです');
}
ただし、この方法はMIMEタイプで判別できるレベルでしか判断できないので「.csv」と「.txt」は同じ扱い(text/plain)になります。