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

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

24
задан kmunky 5 January 2010 в 14:32
поделиться

6 ответов

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

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

.
24
ответ дан 28 November 2019 в 22:27
поделиться

Нативные способы получения mimetype:

Для PHP < 5.3 используйте mime_content_type()
Для PHP >= 5. 3 используйте finfo_fopen()

Альтернативами для получения MimeType являются exif_imagetype и getimagesize, но они зависят от того, установлены ли соответствующие libs. Кроме того, они, скорее всего, просто вернут миметипы образов вместо всего списка, приведённого в magic.mime.

Если вы не хотите беспокоиться о том, что доступно в вашей системе, просто оберните все четыре функции в прокси метод, который делегирует вызов функции тому, что доступно, e. g.

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
ответ дан 28 November 2019 в 22:27
поделиться

Вы можете использовать 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 не установлен, или просто не работает волшебный файл пантомимы (он корректно работает на 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]);
}

Затем просто передайте тип файла-мим в оператор 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
ответ дан 28 November 2019 в 22:27
поделиться

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

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

Выход:

изображение/подпись

текст/объявление

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

.
4
ответ дан 28 November 2019 в 22:27
поделиться

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

2
ответ дан 28 November 2019 в 22:27
поделиться

Чтобы найти тип 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
ответ дан 28 November 2019 в 22:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: