Как определить mime type файла?

Bermuda

Новичок
Как определить mime type файла?

Пользователь загружает файлы на сервер.
Загрузка асинхронная. (Пример смотрите на http://panoramio.com/)

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

Требуется каким-то образом различать содержимое файлов.

Способ первый:
в массиве $_FILES смотреть какой mime type шлет обозреватель пользователя. Эти данные шлет клиент и доверять им не стоит. Более того, если в системе не установлен МС Офис, то обозреватель шлет application/data, что не верно. Более того, при постобработке этих данных просто нет.

Способ второй:
http://php.net/manual/en/function.mime-content-type.php
Не поддерживается и под Виндовс уже не работает. Разработчики рекомендуют использовать расширение Fileinfo из PECL.

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

Способ четвертый:
Использовать программу "file" входящую в состав Linux. То же самое ограничение, что и в предыдущем случае.


Казалось бы, простая задача -- определить тип файла по его содержимому.

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

Спасибо.
 

Wicked

Новичок
Для меня всегда было загадкой, зачем определять тип файла по его содержимому. Почему не по расширению?
 

Wicked

Новичок
StUV
Провалидировать то никто не мешает.
Я бы не стал считаться с юзером, который пытается залить какой-нибудь офисный документ с расширением .jpeg, и гадать: "а не офисный ли это документ?!". Если jpeg - значит должна быть картинка. Если в содержимом невалидная картинка - не принимать аплоад.
 

Bermuda

Новичок
Автор оригинала: Wicked
Почему не по расширению?
А почему не по имени?

Я бы не стал считаться с юзером, который пытается залить какой-нибудь офисный документ с расширением .jpeg, и гадать: "а не офисный ли это документ?!".
Чтобы узнать соответствует ли содержимое файла заявленному расширению, нужно знать тип содержимого файла.

Если jpeg - значит должна быть картинка. Если в содержимом невалидная картинка - не принимать аплоад.
Если doc - значит должен быть документ ворда. Если в содержимом невалидный документ - не принимать аплоад.
Ой, а как я узнаю, что в содержимом?

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

Расширение -- это часть имени файла, не более и всего лишь помогает программам фильтровать свои/чужие файлы по маске. Вам встречались файлы *.dat, *.nfo?

А еще, когда отдаем файл скриптом, было бы замечательно знать тип файла и отправить клиенту соответсвующие заголовки.
 

@ndrey

Новичок
...и админ Петя запретил траффик mp3, а мне надо залить на сервер и дать ссылку друзьям..
 

@ndrey

Новичок
это я к тому, что нужно знать тип содержимого, а не расширение
 

Bermuda

Новичок
Ну хорошо. Естьу меня некий файл подписей magic.mime.
Кто-нибудь знает как его трактовать?
 

@ndrey

Новичок
Слушай Bermuda , а если использовать определение типа по сигнатурам? напрмер, .exe - "MZ" или утопия?
 

Beavis

Banned
ну картинку можно проверить ф-циями из GD, а остальные - наверно только изучив структуру формата, и проверяя её
 

Bermuda

Новичок
Слушай @ndrey, а ты специально пишешь ровно то, что я написал, но другими словами?

Забил я на эту идею. Пусть загружают все, что душа пожелает. А уж видео и картинку от других файлов я отличу.

Всем спасибо!
 

Wicked

Новичок
Естественно, есть случаи, когда нельзя по-нормальному провалидировать документы. Тот же документ от ворда-2003 хрен разберешь. Поэтому придется смириться с тем, что как правило (может быть не в твоем конкретном случае) задача валидации невозможна. Но я за то, чтобы не заниматься самодеятельностью, и не искать пути, как бы себе пропихнуть пришедший файл.

информация к размышлению:
http://httpd.apache.org/docs/2.2/mod/mod_mime.html - делаем сначала;
http://httpd.apache.org/docs/2.2/mod/mod_mime_magic.html - делаем "в качестве второй линии обороны", если mod_mime не сработал.
 

Bermuda

Новичок
http://httpd.apache.org/docs/2.2/mod/mod_mime_magic.html
Вот может кто-нибудь видел реализацию средствами php, какой-нибудь класс/библиотеку?
 

HEm

Сетевой бобер
а исходников file из четвертого варианта нет?
 

@ndrey

Новичок
Bermuda нет, далеко не специально - мой первый пост был в догонку твоему...в принципе проехали
извини, если вызвал негативные эмоции.
 

SiMM

Новичок
> А почему не по имени?
Потому что с точки зрения сервера основная задача - не допустить исполнения залитого пользователем на сервере.

> Ой, а как я узнаю, что в содержимом?
А зачем?

> картинку можно проверить ф-циями из GD
Например?
 

Bermuda

Новичок
SiMM
> картинку можно проверить ф-циями из GD
Например?
У картинки можно проверить размер. А еще можно попробовать изменить ее размер. Да, в картинке может содержаться (о ужас!) php-код и что? Кто собирается его выполнять?

> Ой, а как я узнаю, что в содержимом?
А зачем?
Мля. Уже три раза выше написал: затем, что мне просто не нужно обслуживать файлы с содержимым которое мне потенциально не нужно. Тут не вопрос безопасности, а дело в том, что пользователь по умолчанию дурак и будет закачивать всякий бред, а потом слать багрепорты, мол не работает. Ясен красен, файлы виндоус медиа в формат flv никто перекодировать не будет/не сможет. Вот я и хочу, чтобы пользователь это знал сразу после загрузки файла.

Потому что с точки зрения сервера основная задача - не допустить исполнения залитого пользователем на сервере.
Буду придираться к словам.
Сервер ничего не выполняет, а лишь предоставляет сервис/услугу. Выполняет что-либо программа. Так вот программа в нашей власти. А посему не стоит выполнять все подряд. Я вообще не понимаю, что должны были курить авторы PHP, чтобы у кодеров закрепилась стойкая ассоциация, что отдача файла скриптом чревата его выполнением.
 
Сверху