PHP, как я могу проверить, является ли файл mp3 или файлом изображения?

как я могу проверить, является ли файл mp3-файлом или файлом изображения, кроме проверки каждого возможного расширения?

Вы можете идентифицировать файлы изображений, используя getimagesize .

Чтобы узнать больше о MP3 и других аудио / видео файлах, мне рекомендовали 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; } 

Чтобы найти тип 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; } 

попробуйте mime_content_type ()

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

Вывод:

изображение / GIF

текст / обычный

Или лучше использовать finfo_file (), другой способ устарел .

Лучше всего искать изображения getimageinfo. Проверьте, является ли тип возврата ложным.

Вы можете использовать модуль FileInfo, который встроен в PHP с 5.3. Если вы используете версию 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 просто не работает (он работает правильно на 3 из наших 4 серверов – все идентичные установки ОС и 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; 

Эта функция проверяет, является ли файл изображением на основе расширения и 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); } ?>