Обнаружение MIME-типа сделано правильно - PullRequest
1 голос
/ 23 июня 2011

В настоящее время я сталкиваюсь с проблемой, которую я нахожу более чем интересной: обнаружение mime-типа данного файла.Под обнаружением я подразумеваю попытку угадать тип mime, используя только информацию, представленную в файле.Под файлом я подразумеваю структуру, которая имеет имя и содержимое.

Вот решения, которые я знаю для этой проблемы:

  • Попытка угадать тип файла в зависимости от файланазвание.Например, если имя файла foo.txt, я могу предположить, что mime-тип равен text/plain
  • Попытка определить тип, используя содержимое, особенно первые байты, которые обычно содержат какую-то магиюкод.Например, если файл начинается с октетов 0xCAFEBABE, я могу предположить, что mime-тип равен application/x-java-class.

Два подхода к этой проблеме имеют свои преимущества и недостатки.

Первое решение очень эффективно, но мы предполагаем, что файл имеет правильное имя и расширение.Как определить mime-тип файла с именем LICENSE или README?

Второй метод немного сложнее и должен фактически считывать данные.Он работает очень хорошо для всех файлов, содержащих магический код, но плохо работает для других файлов.Могут возникнуть некоторые проблемы: как определить разницу между файлом MS-DOS EXE (начиная с MZ в качестве магического кода) и действительным файлом text/plain, начинающимся с букв MZ.Много подобных проблем возникает, когда вы рассматриваете другие типы файлов (txt против csv; html против xml против xhtml).

Итак, возникает реальный вопрос: как обнаружитьэффективно и надежно, mime-тип файла?


Некоторые примечания:

  • Я знаю, что существует множество библиотек, которые выполняют эту работу.Мне не интересны библиотеки.Я заинтересован в том, чтобы испачкать руки.
  • Нет конкретного языка.Меня интересует общий алгоритм (ы), а не конкретная реализация.

1 Ответ

1 голос
/ 23 июня 2011

Ответ на ваш вопрос, вероятно, просто "регулярные выражения" , поскольку вы запрашиваете алгоритмы, а не инструменты. На самом деле поиск шаблонов в файле, чтобы угадать, что это, безусловно, самый лучший способ решить, что это такое. Если вы сомневаетесь, вы также можете посмотреть на расширение файла (если есть), но вам не следует полагаться на него. Например, в системах UNIX ОС не заботится о расширении файла, когда решает, может ли он выполнить файл или нет. Поэтому никогда не следует полагаться на расширение файла.

Сама задача тривиальна с алгоритмической точки зрения: собирать регулярные выражения, идентифицирующие различные типы файлов. Но это большая работа, для каждого типа файла, который вы хотели бы распознать, вам необходимо ознакомиться с его дизайном, чтобы действительно иметь возможность написать выражение, которое действительно распознает тип файла с минимальным количеством ложных срабатываний и ложных отрицаний. .

Так зачем беспокоиться и пытаться решить проблему, в которую другие люди уже вложили значительные средства? Как вы, вероятно, знаете, наиболее распространенным решением является инструмент UNIX file и его библиотека libmagic, которые можно легко использовать в ваших программах. Существуют привязки к наиболее распространенным языкам сценариев. «Волшебная» база данных утилиты file, пожалуй, самая полная из всех, зная об экзотических типах файлов, о которых вы никогда не слышали раньше (поскольку они широко используются годами или десятилетиями) и была настроена и исправлена ​​для долгое время (колоссальные 38 лет).

...