PHP如何检查一个文件是mp3还是图像文件?

我如何检查一个文件是否是一个MP3文件或图像文件,而不是检查每个可能的扩展名?

您可以使用getimagesize来识别图像文件。

要了解有关MP3和其他audio/video文件的更多信息,我build议使用php-mp4info getID3()

本机的方式来获得mimetype:

对于PHP <5.3使用mime_content_type()
对于PHP> = 5.3,使用finfo_fopen()

获取MimeType的替代方法是exif_imagetype和getimagesize ,但这些依赖于安装了相应的库。 此外,他们可能会返回图像mimetypes,而不是magic.mime给出的整个列表。

如果你不想打扰系统中可用的东西,只需将所有四个函数包装到一个代理方法中,该代理方法将函数调用委托给任何可用的方法,例如

 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; } 

要find文件的MIMEtypes,我使用下面的包装函数:

 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; } 

尝试mime_content_type()

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

输出:

图像/ GIF

纯文本/

或者更好的使用finfo_file() ,另一种方式是不build议使用的

getimageinfo是最好的find图像。 检查返回types是否为false。

您可以使用5.3以来内置于PHP中的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

你可以像这样使用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 magic文件不能正常工作(它可以在我们的4台服务器中的3台服务器上正常运行 – 所有相同的操作系统和PHP安装) – 然后尝试使用Linux的本机文件(请不要忘记来清理文件名,虽然:在这个例子中,我知道文件名可以被信任,因为它是我的testing代码中的一个PHP临时文件名):

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

然后只需将mime文件types传递给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; 

此函数检查文件是否是基于扩展名和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; } 

对于图片,我使用:

  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; } 

最好的方法是使用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); } ?>