Каков наилучший способ определить, является ли файл изображением в PHP? - PullRequest
2 голосов
/ 06 декабря 2011

У меня есть сервер, на который люди могут загружать файлы.Проблема в том, что некоторые имена файлов искажены (не имеют расширения), и поэтому я не могу сразу определить тип файла.Этот вопрос состоит из двух частей: для файлов, которые имеют имена файлов, каков наилучший способ определить, является ли это изображение?(Просто большой длинный список if / else if?) Во-вторых, как определить, являются ли они изображениями для файлов, которые не имеют расширений?

Ответы [ 12 ]

5 голосов
/ 06 декабря 2011

Вы можете использовать exif_imagetype()

<?php
    $type =exif_imagetype($image);

, где $ type является значением

  1. IMAGETYPE_GIF
  2. IMAGETYPE_JPEG
  3. IMAGETYPE_PNG
  4. IMAGETYPE_SWF
  5. IMAGETYPE_PSD
  6. IMAGETYPE_BMP
  7. IMAGETYPE_TIFF_II (порядок байтов Intel)
  8. IMAGETYPE_JPC
  9. IMAGETYPE_JP2
  10. IMAGETYPE_JPX
  11. IMAGETYPE_JB2
  12. IMAGETYPE_SWC
  13. IMAGETYPE_XBM
  14. IMAGETYPE_ICO

Из руководства:

При обнаружении правильной сигнатуры будет возвращено соответствующее постоянное значение, в противном случае возвращаемое значение будетЛОЖНЫЙ.Возвращаемое значение - это то же значение, которое getimagesize() возвращает в индексе 2, но exif_imagetype() намного быстрее.

4 голосов
/ 06 декабря 2011

Вы можете использовать getimagesize Он не требует библиотеки изображений GD и возвращает ту же информацию о типе изображения. http://it2.php.net/manual/en/function.getimagesize.php

2 голосов
/ 23 декабря 2011

Здесь у вас есть два варианта, один простой и предварительно с некоторыми недостатками, другой сложный и требует математики.

PHP fileinfo может использоваться для определения типов файлов на основе фактической информации заголовка файла. Например, я только что схватил твой гравитар:

enter image description here

Но фактический код таков:

‰PNG


IHDR  szzô
IDATX…­—OL\UÆZÀhëT)¡    c•1T:1‘Š‘.Ú(]4†A“ÒEY˜à.................................

Так что, даже без имени файла я мог обнаружить его совершенно очевидно. Это то, что будет делать расширение PHP Fileinfo. В большинстве файлов PNG и JPG этот заголовок, как правило, присутствует, но это не так для каждого типа файла.

Как говорится, fileinfo очень прост в использовании из руководства:

$fi = new finfo(FILEINFO_MIME,'/usr/share/file/magic');
$mime_type = $fi->buffer(file_get_contents($file));

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

Примерно так выглядит файл GIF:

enter image description here

И что-то вроде этого выглядит как файл TIFF:

enter image description here

Оттуда вам нужно будет сгенерировать модель для нескольких типов файлов для того, какой должна быть гистограмма каждого типа, а затем использовать ее, чтобы угадать. Это хороший метод для файлов, которые на самом деле не имеют тех «волшебных заголовков», которые можно легко прочитать. Имейте в виду, вам нужно изучить некоторые математические навыки и способы моделирования средней функции гистограммы и сопоставления их с файлами.

2 голосов
/ 06 декабря 2011

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

1 голос
/ 23 декабря 2011

exif_imagetype () может работать

убедитесь, что у вас включен exif.

1 голос
/ 06 декабря 2011

Посмотрите на изображение магической идентификации.http://www.imagemagick.org/script/identify.php

Оболочка php находится здесь: http://www.php.net/manual/en/function.imagick-identifyimage.php

Или, если вы просто хотите подтвердить, что это изображение (и не заботитесь о метаданных):http://www.php.net/manual/en/function.imagick-valid.php

1 голос
/ 06 декабря 2011

Вы можете попробовать загрузить изображение в библиотеку PHP GD и посмотреть, работает ли оно.

$file = file_get_contents('file');
$img = imagecreatefromstring($file);
if($img === FALSE){
  // file is NOT an image
}
else{
  // file IS an image
}
0 голосов
/ 23 декабря 2011

Тип изображения, как правило, может быть получен из информации заголовка файла.

0 голосов
/ 07 декабря 2011

Если вам нужно быстрое решение, используйте imagesx () и imagesy ().Существует также быстрый способ проверки больших размеров файла изображения, считывая только небольшой объем данных из заголовка файла.Более подробно объяснено в следующем URL:

http://hungred.com/useful-information/php-fastest-image-width-height/

0 голосов
/ 06 декабря 2011

Попробуйте посмотреть exif_imagetype

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...