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

Андрейка

Senior pomidor developer
Bermuda
в чем заключается "обслуживание"? у тебя есть полный список типов файлов, который тебе надо обслужить и есть чем это сделать?
в каком таком случае пользователь будет слать багрепорты? когда закачает картинку с расширением xls?
 

korchasa

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

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

...
Вряд ли в мире нашлись извращенцы, которые анализируют сигнатуры файлов на РНР. Поищите на Perl, если perl вас, конечно, устроит. Он ведь тоже не на каждом хостинге.

Хотя я бы рекомендовал вам написать адаптеры для разных методов определения, и применять разные в зависимости от сервера. Это не ваши проблемы, что клиенты при выборе между VPS linux и shared windows они сделали неправильный выбор ;)

А почему PECL не подощел? Не скомпилировался?
 

SiMM

Новичок
> У картинки можно проверить размер. А еще можно попробовать изменить ее размер.
Ничего это не меняет.

> затем, что мне просто не нужно обслуживать файлы с содержимым которое мне потенциально не нужно
Расширения (или списка для выбора типа документа) для этого более чем достаточно, а пользователь, подсовывающий незнамо что под видом чего-то другого - сам себе злобный буратино.

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

jonjonson

Охренеть
У меня дежавю или это уже обсуждалось?
http://phpclub.ru/talk/showthread.php?s=&threadid=68007&perpage=20&pagenumber=1
 

Wicked

Новичок
Bermuda, пока что ты ничего не написал про то, под каким именем ты будешь сохранять файл. Тогда предлагаю рассмотреть такой случай, на который намекает SIMM:

1) я аплоажу тебе файл image.php, содержимое которого является тупо jpeg-картинкой с некоторым php-кодом, прописанным в exif.

2) твой фильтр глядит на это дело, и понимает, что это реально картинка, и (предположим) сохраняет его на сервере тоже под именем image.php.

внимание, вопрос: как поступит с этим файлом любой уважающий сервер при запросе этого файла по http?
 

Bermuda

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

Вряд ли в мире нашлись извращенцы, которые анализируют сигнатуры файлов на РНР
Ну на си же анализируют, да?

Это не ваши проблемы, что клиенты при выборе между VPS linux и shared windows они сделали неправильный выбор
Как раз-таки мои. Фрэймворк должен работать на большинстве стандартных хостингов.

А почему PECL не подощел? Не скомпилировался?
Всем подошел, но не на каждом хостинге есть.

jonjonson
Тут все ширше/ширее :)

под каким именем ты будешь сохранять файл
Попробую описать структуру
Код:
/public -- веб-корень
/public/index.php
/private/
/private/uploads/

файлы хранятся здесь
/private/uploads/1
/private/uploads/2
/private/uploads/3
/private/uploads/4
/private/uploads/5
/private/uploads/6
Реально файл будет хранится в папке недоступной через веб.
При запросе файла
http://host/uploads/foo.bar
Будет сгенерирована ошибка 404, потому как такого файла нет. Обработчиком ошибки будет php-скрипт который сделает запрос к базе по имени файла, найдет его идентификатор, прочитает содержимое файла и отдаст клиенту. Уникальность имен файлов обеспечивается.

является тупо jpeg-картинкой с некоторым php-кодом
Я не против.

твой фильтр глядит на это дело, и понимает, что это реально картинка, и (предположим) сохраняет его на сервере тоже под именем image.php.
Э нет, под тем же именем это вряд ли. Как минимум я бы сменил расширение, на правильное определенное по типу файла (это если бы я хотел выложить файлы для прямого доступа). В идеале файл сохраняется на диск с уникальным именем и без расширения. Также в базу сохраняется его оригинальное имя, с которым файл будет отдан клиенту. А если бы я был очень суров, то я бы завел таблицу соответствия типа файла расширению, и если закачанный файл этому условию не соответствует, то пусть гуляет лесом.

-~{}~ 17.10.07 08:24:

как поступит с этим файлом любой уважающий сервер при запросе этого файла по http?
В моем случае сервер сгенерит ошибку 404 и перенаправит ее с параметрами на index.php, который в свою очередь отдаст клиенту файл.
 

Wicked

Новичок
хотя ладно.

у меня есть четкое убеждение, что:
1) ты решаешь высосанную из пальца проблему: как часто, по твоему, тебе будут присылать файлы, у которых тип содержимого не соответствует расширению? Я бы забил на таких юзеров в виду их немногочисленности.
2) Ты зря прогибаешься под юзера. Я бы на таких забил еще и потому, что они сами себе злобные буратины.
3) из-за этого ты уже начинаешь иметь проблемы: о чем говорит сам факт того, что тебе нужно сделать такую не совсем тривиальную штуку; отдавать файлы скриптом, а не веб-сервером - тоже не сахар. И т.д.

Больше убеждать тебя не буду.

-~{}~ 17.10.07 13:47:

Bermuda
миме тип --> возможные расширения
где тут условие, у которого можно проверить истинность или ложность?
 

Bermuda

Новичок
Wicked
Отдавать файлы скриптом мне нужно еще и потому что
- пользователь может не иметь прав для доступа к файлу (недостаточно привелегий)
- документ имеет флаг публикациии
- документ имеет дату публикации и дату "смерти"
Т. е. мне нужно контролировать доступ к файлу по еще нескольким условиям.

Ты зря прогибаешься под юзера
Если ты заметил, то несколькими фразами выше я уже отказался от этой идеи. А вот пообсуждать и послушать умных людей мне всегда интересно :)

-~{}~ 17.10.07 08:56:

где тут условие, у которого можно проверить истинность или ложность?
image/pjpeg может иметь расширения jpg, jpeg, jpe. Если тип определен как image/pjpeg, а расширение другое, то вот тебе и условие. В зависимости от суровости можно либо менять расширение, либо отправлять гулять лесом.
 

Bermuda

Новичок
SiMM
mod_rewrite очень ресурсоемкий модуль, и на наших хостингах его обычно не ставим. А так да, можно.
 

jonjonson

Охренеть
Bermuda, нафиг не нужно никакого определения типа файла. Всё намного проще. Загружаемый файл должен иметь допустимое расширение. На сервисе не должно быть прав на смену расширения файла. Всё.

При ресазе для изображений или создании тумбнейлов графические функции сами определят, подходит ли для них файл в качестве источника.
 
Сверху