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

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

Ответы [ 11 ]

30 голосов
/ 05 января 2010

Родные способы получения mimetype:

Для PHP <5.3 используйте <a href="http://php.net/manual/en/function.mime-content-type.php" rel="nofollow noreferrer"> mime_content_type ()
Для PHP> = 5.3 используйте finfo_fopen ()

Альтернативы для получения MimeType: exif_imagetype и getimagesize , но они основаны на установке соответствующих библиотек. Кроме того, они, скорее всего, будут просто возвращать миметипы изображений вместо всего списка, указанного в 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;
}
24 голосов
/ 05 января 2010

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

Чтобы узнать больше о MP3 и других аудио / видео файлах, мне рекомендовали php-mp4info getID3 () .

6 голосов
/ 08 января 2010

Чтобы найти 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;
}
4 голосов
/ 05 января 2010

try mime_content_type ()

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

Выход:

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

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

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

3 голосов
/ 23 июня 2011

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

2 голосов
/ 05 января 2010

Вы можете использовать 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 (он работает правильно на 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;
2 голосов
/ 05 января 2010

Вы можете использовать модуль 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

1 голос
/ 13 марта 2013

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

}
0 голосов
/ 10 апреля 2018

Эта функция получает путь к файлу и с использованием 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 голосов
/ 05 июля 2016

Лучший способ - использовать функцию 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);
}
?>
...