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

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

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

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

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

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

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


person mysqllearner    schedule 20.05.2010    source источник
comment
возможный дубликат Как мне найти mime-тип файла с php?   -  person Stefan Gehrig    schedule 20.05.2010
comment
Эм, я немного запутался. На самом деле я прочитал этот пост, но не могу найти хороших ответов, я имею в виду, я не могу найти приемлемых ответов, значит ли это, что я не могу публиковать подобные вопросы в будущем, если еще нет абсолютного ответа? Что такое правила? Я хочу знать, чтобы я мог следить =)   -  person mysqllearner    schedule 20.05.2010
comment
И я думаю, что этот пост (stackoverflow.com/questions/134833/) был задан 1 год назад, я сомневаюсь, что на него будут какие-либо новые ответы =(   -  person mysqllearner    schedule 20.05.2010
comment
Я использую mime.types Apache для сопоставления расширений с типами mime.   -  person Artefacto    schedule 20.05.2010
comment
Какие файлы вы ожидаете? Картинки? Конкретные документы?   -  person Salman A    schedule 20.05.2010
comment
Ага, изображения. Формат файла белого списка: jpg, gif и png. Черный список: php, asp, exe и т.д.   -  person mysqllearner    schedule 21.05.2010


Ответы (3)


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

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

person mario    schedule 20.05.2010
comment
mime.php незакончен, и я только что проверил его, он не работает :( - person Jerome Ansia; 26.04.2012

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

person Curtis Gibby    schedule 25.03.2013

Вы можете использовать магические числа, свериться с некоторыми другими списками сигнатур файлов ( < href="http://www.garykessler.net/library/file_sigs.html" rel="nofollow">как здесь), а затем проверьте двоичные данные на наличие первого байта.

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, например, этого.

person Obmerk Kronen    schedule 01.10.2013