PHP, Как получить Mime Type - Миссия невыполнима? - PullRequest
8 голосов
/ 20 мая 2010

Есть ли в PHP достойный способ получить тип mime?

Последние несколько часов я интенсивно искал, и кажется, что есть три основных способа, каждый из которых имеет проблемы:

  1. mime_content_type () Это устарело, часто не устанавливается, и если установлено, иногда не будет найден файл mime.magic.

  2. file_info Не был установлен на хостах, которые я пробовал, похоже, не очень хорошая поддержка. Является расширением (PECL).

  3. shell_exec (файл -ib. $ File) Не работает на серверах Windows. Я попробовал это на сервере Linux, и он дал мне «image / x-3ds2» для файла php. Какого черта это !!!

Что такое хороший, почти пуленепробиваемый способ получения файла MIME-типа?

Ответы [ 3 ]

2 голосов
/ 20 мая 2010

В качестве обходного пути вы можете использовать расширение "mime.php" из http://upgradephp.berlios.de/ Он имитирует mime_content_type () , если он недоступен. Сделано специально для таких случаев.

Вы можете установить свой личный файл mime.magic и принудительно установить его с помощью ini_set ("mime_magic.magicfile"). В любом случае это рекомендуется, поэтому у вас есть нужные настройки.

0 голосов
/ 01 октября 2013

Вы можете использовать магические числа , просмотреть некоторые другие списки сигнатур файлов (, например, здесь ), а затем проверить двоичные данные для первого байта.

function getfiletype($file) {
    $handle = @fopen($file, 'r');
    if (!$handle)
        throw new Exception('File error - Can not open File or file missing');

    $types = array( 'jpeg' => "\xFF\xD8\xFF", 
                    'gif' => 'GIF',
                    'bmp' => 'BM',
                    'tiff' => '\x49\x20\x49',
                    'png' => "\x89\x50\x4e\x47\x0d\x0a",
                    'psd' => '8BPS', 
                    'swf' => 'FWS');

    $bytes = fgets($handle, 8);
    $filetype = 'other';

    foreach ( $types as $type => $header ) {
        if ( strpos( $bytes, $header ) === 0) {
            $filetype = $type;
            break;
        }
    }
    fclose($handle);
    return $filetype;
}

На самом деле это очень простая функция замены для file_info (), которая работает практически так же, но на значительно расширенном (и более низком) уровне.

Альтернативой является использование уже созданного внешнего класса php, например , например, ..

0 голосов
/ 25 марта 2013

Крис Жан разработал функцию с именем get_file_mime_type, которая сначала пытается использовать метод finfo_open, затем возвращается к mime_content_type, а затем, наконец, возвращается к простому массиву extension => mime_type , Это хорошо работает для меня, когда первые два варианта не были доступны на моем сервере. Лучше, чем написать саму функцию!

...