web-dev-qa-db-ja.com

PHPファイルがmp3か画像ファイルかを確認するにはどうすればよいですか?

ファイルがmp3ファイルまたはイメージファイルであるかどうかを、可能な拡張子ごとに確認する以外に、どうすれば確認できますか?

25
kmunky

getimagesize を使用して画像ファイルを識別できます。

MP3やその他のオーディオ/ビデオファイルについて詳しく知るために、 php-mp4infogetID3()

25
Pekka

MIMEタイプを取得するネイティブの方法:

PHP <5.3の場合 mime_content_type() を使用します
PHP> = 5.3の場合 finfo_fopen() を使用します

MimeTypeを取得する代替手段は exif_imagetype および getimagesize ですが、これらは適切なライブラリがインストールされていることに依存しています。さらに、それらは magic.mime で指定されたリスト全体ではなく、単に画像のMIMEタイプを返す可能性があります。

システムで利用可能なものについて気になりたくない場合は、4つの関数すべてをプロキシメソッドにラップして、関数呼び出しを利用可能なものに委任します。

function getMimeType($filename)
{
    $mimetype = false;
    if(function_exists('finfo_fopen')) {
        // open with FileInfo
    } elseif(function_exists('getimagesize')) {
        // open with Gd
    } elseif(function_exists('exif_imagetype')) {
       // open with EXIF
    } elseif(function_exists('mime_content_type')) {
       $mimetype = mime_content_type($filename);
    }
    return $mimetype;
}
30
Gordon

ファイルのMIMEタイプを見つけるには、次のラッパー関数を使用します。

function Mime($path)
{
    $result = false;

    if (is_file($path) === true)
    {
        if (function_exists('finfo_open') === true)
        {
            $finfo = finfo_open(FILEINFO_MIME_TYPE);

            if (is_resource($finfo) === true)
            {
                $result = finfo_file($finfo, $path);
            }

            finfo_close($finfo);
        }

        else if (function_exists('mime_content_type') === true)
        {
            $result = preg_replace('~^(.+);.*$~', '$1', mime_content_type($path));
        }

        else if (function_exists('exif_imagetype') === true)
        {
            $result = image_type_to_mime_type(exif_imagetype($path));
        }
    }

    return $result;
}
6
Alix Axel

試してみてください mime_content_type()

<?php
echo mime_content_type('php.gif') . "\n";
echo mime_content_type('test.php');
?> 

出力:

画像/ gif

テキスト/プレーン

または、より適切に finfo_file() を使用する方法はdeprecatedです。

4
Burntime

getimageinfoは画像を見つけるのに最適です。戻り値の型がfalseかどうかを確認します。

3

次のように finfo を使用できます。

$mime = finfo_open(FILEINFO_MIME, $path_to_mime_magic_file);
if ($mime ===FALSE) {
    throw new Exception ('Finfo could not be run');
}
$filetype = finfo_file($mime, $filename);
finfo_close($mime);

または、finfoがインストールされていない、またはmimeマジックファイルが機能しないという問題がある場合(4つのサーバーのうち3つ-すべて同じOSとPHPインストール)で正しく機能します)-次に試してくださいLinuxのネイティブファイルを使用する(ただし、ファイル名をサニタイズすることを忘れないでください。この例では、ファイル名は、PHPテストコードの一時ファイル名)であるため、信頼できることを知っています):

ob_start();
system('file -i -b '.$filename);
$output = ob_get_clean();
$output = explode("; ", $output);
if (is_array($output)) {
     $filetype = trim($output[0]);
}

次に、mimeファイルタイプを次のようなswitchステートメントに渡します。

switch (strtolower($filetype)) {
            case 'image/gif':
                return '.gif';
                break;
            case 'image/png':
                return '.png';
                break;
            case 'image/jpeg':
                return '.jpg';
                break;
            case 'audio/mpeg':
                return '.mp3';
                break;
}
return null;
2
Richy B.

PHP 5.3以降に組み込まれているFileInfoモジュールを使用できます。PHPより古いバージョンPHP 5.3、PECL拡張機能としてインストールできます。

インストール後、finfo_file関数はファイル情報を返します。

PECL拡張子: http://pecl.php.net/package/fileinfo

PHPドキュメント: http://www.php.net/manual/en/book.fileinfo.php

2
catsby

この関数は、ファイルが拡張子とMIMEに基づく画像であるかどうかをチェックし、ブラウザ互換の画像である場合はtrueを返します...

function checkImage($image) {

//checks if the file is a browser compatible image

$mimes = array('image/gif','image/jpeg','image/pjpeg','image/png');
//get mime type
$mime = getimagesize($image);
$mime = $mime['mime'];

$extensions = array('jpg','png','gif','jpeg');
$extension = strtolower( pathinfo( $image, PATHINFO_EXTENSION ) );

if ( in_array( $extension , $extensions ) AND in_array( $mime, $mimes ) ) return TRUE; 
else return FALSE; 

}
1
JaseC

最良の方法は、finfo_file関数を使用することです。例:

<?php 
if (isset($_FILES['yourfilename']['tmp_name'])) {
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mime = finfo_file($finfo, $_FILES['yourfilename']['tmp_name']);
    if ($mime == 'image/jpg') {
        echo "It's an jpg image!";
    }
    finfo_close($finfo);
}
?>
0
Alex Langer

この関数はファイルパスを取得し、finfo_openおよびmime_content_typeを使用してサポートされている場合は、imageまたはvideoまたはaudio文字列を返します。

/**
 * get file type
 * @return image, video, audio
 */
public static function getFileType($file)
{
    if (function_exists('finfo_open')) {
        if ($info = finfo_open(defined('FILEINFO_MIME_TYPE') ? FILEINFO_MIME_TYPE : FILEINFO_MIME)) {
            $mimeType = finfo_file($info, $file);
        }
    } elseif (function_exists('mime_content_type')) {
        $mimeType = mime_content_type($file);
    }
    if (strstr($mimeType, 'image/')) {
        return 'image';
    } else if (strstr($mimeType, 'video/')) {
        return 'video';
    } else if (strstr($mimeType, 'audio/')) {
        return 'audio';
    } else {
        return null;
    }
}
0
Nabi K.A.Z.

画像の場合、次を使用します:

    function is_image($path)
   {
    $a = getimagesize($path);
    $image_type = $a[2];

    if(in_array($image_type , array(IMAGETYPE_GIF , IMAGETYPE_JPEG ,IMAGETYPE_PNG , IMAGETYPE_BMP)))
    {
        return true;
    }
    return false;
    }
0
Hoàng Vũ Tgtt