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

Какой самый лучший и быстрый способ проверить, является ли изображение действительным в PHP? Мне нужно, чтобы иметь возможность проверить GIF, JPG, а также PNG изображения.

Ответы [ 6 ]

29 голосов
/ 06 января 2014

exif_imagetype - лучшее решение.

Этот метод быстрее, чем использование getimagesize. Цитировать php.net"Возвращаемое значение - это то же значение, которое getimagesize () возвращает в индексе 2, но exif_imagetype () намного быстрее."

if(exif_imagetype('path/to/image.jpg')) {
    // your image is valid
}

Обновление:

После прочтения, что getimagesize может быть ненадежным, я попытался найти больше информации о том, какие типы файлов могут давать ложные срабатывания, но не смог найти больше информации, поэтому выполнил краткий тест (используя exif_imagetype):

PowerPoint-survey-results.pptx - N
LRMonoPhase4.wav               - N
TestWordDoc.doc                - N
drop.avi                       - N
test.dll                       - N
raw_data_sample.sav            - N
text.txt                       - N
Excel-survey-results.xlsx      - N
pdf-test.pdf                   - N
simplepie-1.5.zip              - N
Word-survey-results.docx       - N
centaur_1.mpg                  - N
Test.svg                       - N
multipage_tif_example.tif      - Y
200.gif                        - Y
Test.png                       - Y
test.jpg                       - Y

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

6 голосов
/ 20 декабря 2016

В соответствии с рекомендациями PHP документации :

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

Вот пример:

$finfo = finfo_open(FILEINFO_MIME_TYPE);
$type = finfo_file($finfo, "test.jpg");

if (isset($type) && in_array($type, array("image/png", "image/jpeg", "image/gif"))) {
    echo 'This is an image file';
} else {
    echo 'Not an image :(';
}
4 голосов
/ 13 сентября 2011

Я думаю getimagesize:

list($width, $height, $type, $attr) = getimagesize("path/to/image.jpg");

if (isset($type) && in_array($type, array(
    IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF))) {
  ...
}
2 голосов
/ 11 ноября 2014

exif_imagetype гораздо быстрее, чем getimagesize, и не использует gd-Lib (оставляя более компактный след)

function isImage($pathToFile)
{
  if( false === exif_imagetype($pathToFile) )
   return FALSE;

   return TRUE;
}
0 голосов
/ 27 сентября 2014

Я использую это:

function is_image($path)
{
    $a = getimagesize($path);
    $image_type = $a[2];

    if(in_array($image_type , array(IMAGETYPE_GIF , IMAGETYPE_JPEG ,IMAGETYPE_PNG , IMAGETYPE_BMP)))
    {
        return true;
    }
    return false;
}
0 голосов
/ 13 сентября 2011

Я использую эту функцию ... она также проверяет URL

function isImage($url){
   $params = array('http' => array(
                'method' => 'HEAD'
             ));
   $ctx = stream_context_create($params);
   $fp = @fopen($url, 'rb', false, $ctx);
   if (!$fp) 
      return false;  // Problem with url

  $meta = stream_get_meta_data($fp);
  if ($meta === false){
      fclose($fp);
      return false;  // Problem reading data from url
  }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...