Найти, если данные файла - изображение (php) - PullRequest
2 голосов
/ 02 июня 2010

Представьте, что у меня есть данные файла в переменной $data. Мне нужно определить, является ли это изображение или нет. Нет необходимости в таких деталях, как поврежденные изображения и т. Д.

Первой мыслью было бы получить тип mime файла, посмотрев на магическое число, а затем посмотреть, относится ли «изображение» к типу mime.

Не повезло, даже если у меня есть сценарий "расширение файла до типа mime", у меня нет надежного способа получить mime по магическому номеру.

Мой следующий вариант состоял в том, чтобы иметь разумный список магических чисел файла изображения и обращаться к ним. Однако найти такие магические числа относительно сложно (например, у gif разные магические числа, некоторые из которых могут быть довольно редкими - если память мне не изменяет).

Лучшей идеей будет какая-нибудь программа для Linux, которая может делать подобные вещи.

Есть идеи? Я использую RHEL и PHP 5.3. У меня есть root-доступ - т.е. я могу установить что-нибудь, если нужно.

- Крис.

Ответы [ 5 ]

6 голосов
/ 02 июня 2010

Лучший ответ (который я определил от полковника Шрапнели) будет использовать:

$handle = imagecreatefromstring($data);

Цитирование руководства по PHP:

Ресурс изображения будет возвращен на успех. ЛОЖЬ возвращается, если тип изображения не поддерживается, данные не в признанном формате, или изображение повреждено и не может быть загружено.

3 голосов
/ 02 июня 2010

Там также было finfo: http://php.net/manual/en/function.finfo-open.php Много рабочего кода на этой странице руководства php.net.

Дополнительно вы можете проверить первые 3 байта вашего потока данных, там должны быть данные заголовка файла изображения, которые определяют формат файла изображения.

3 голосов
/ 02 июня 2010

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

$ file test.jpg 
test.jpg: JPEG image data, JFIF standard 1.01

Если вы не хотите создавать временный файл, вы можете использовать file - и передать данные в его стандартный вывод. Убедитесь, что вы наблюдаете за завершением дочернего процесса, потому что file запишет свой вывод и остановится, как только прочитает достаточно вашего потока, чтобы быть уверенным в формате.

2 голосов
/ 02 июня 2010

Если бы я был на вашем месте, я бы не использовал решение imagecreatefromstring, если вам нужно только , чтобы определить, является ли оно изображением, поскольку при создании этого изображения потребуется дополнительная память ресурс. Также он будет поддерживать только JPEG, PNG, GIF, WBMP и GD2. в то время как другие одинаково допустимые форматы изображений не будут действительными, например. ICO.

Я бы использовал finfo , как предложено, или, если у вас нет расширений PECL, я бы порекомендовал file -bi image.... Как бы вернуть тип контента, например. image/png. Вы можете просто проверить, начинается ли оно с image/*. Таким образом, ваш скрипт будет принимать любой формат изображения.

1 голос
/ 02 июня 2010

Я думаю, стандартного getimagesize () достаточно.
Конечно, для этого нужен файл, но это не имеет большого значения.

...