Как определить, является ли URL изображением или нет? - PullRequest
4 голосов
/ 13 января 2010

Я хочу узнать из синтаксиса, является ли URL изображением или нет. пример: http://www.blah.com/plo52.jpg или png или gif вернет true. если URL заканчивается другим расширением, функция вернет false.

Спасибо

Ответы [ 8 ]

14 голосов
/ 13 января 2010

Проверьте MIME-тип файла.

8 голосов
/ 13 января 2010

Это не скажет вам, если это действительно изображение. Это только скажет вам, что выглядит в соответствии с URL:

$url = "http://somedomain.com/images/kittens.jpg";
if(preg_match("/\.(png|jpeg|jpg|gif|bmp)$/i", $url)) {
  print "Appears to be an image";
} else {
  print "Not an image.";
}

Выходы:

    Appears to be an image

Обратите внимание, что если вы ожидаете увидеть изображения, передаваемые с помощью сценариев .php или .aspx, этот метод завершится неудачей. Чтобы получить действительно надежный тест, вам нужно проверить mime-тип.

5 голосов
/ 13 января 2010

Я предлагаю сделать запрос HTTP HEAD , чтобы вам не нужно было загружать все изображение целиком, а затем на основе возвращенной строки проанализировать и убедиться, что Content-Type является image/jpeg, image/pjpeg, image/gif, image/png или подобное изображение. Типы содержимого.

<?php

function parseImage( $url ) {
        $ch = curl_init();

    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 20 );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );

    curl_setopt( $ch, CURLOPT_HEADER, true );
    curl_setopt( $ch, CURLOPT_NOBODY, true );

    $content = curl_exec( $ch );

    var_dump($content);
    curl_close($ch);
}

parseImage('http://sstatic.net/so/img/logo.png');

Возвращает

строка 'HTTP / 1.1 200 OK

Cache-Control: max-age = 604800

Длина содержимого: 3438

Тип содержимого: изображение / png

Дата последнего изменения: вс, 10 января 2010 09:14:52 GMT

Диапазон принятия: байты

ETag: "32741b5ed591ca1: 0"

Сервер: Microsoft-IIS / 7.5

Дата: ср., 13 января 2010 20:37:47 GMT

'(длина = 256)

Конечно, заголовок Content-Type может быть подделан, но в 99% случаев этого не произойдет, поэтому этот метод надежен.

3 голосов
/ 13 января 2010

URL-адреса, не относящиеся к изображениям, могут передавать изображения обратно. Например, URL-адрес ashx или asp может вернуть вам данные изображения. Лучший способ - проверить тип MIME Response.ContentType.

2 голосов
/ 13 января 2010

Если вам действительно нужно быть на 100% уверенным, вам нужно скачать ресурс и проверить его, используя getimagesize () .

1 голос
/ 13 января 2010

Используйте headers_list, а затем проверьте тип содержимого http://php.net/manual/en/function.headers-list.php

1 голос
/ 13 января 2010

Вы можете использовать pathinfo для получения расширения:

echo pathinfo('http://www.blah.com/plo52.jpg', PATHINFO_EXTENSION); // jpg

затем оберните его в функцию

function hasExtension($uri, array $extensions = array('jpg','gif','png'))
{
    return in_array(pathinfo($uri, PATHINFO_EXTENSION), $extensions);
}

hasExtension('http://www.blah.com/plo52.jpg'); // true

Это также будет работать с обычными путями к файлам, и, передавая массив $ extension, вы не ограничены шаблоном регулярного выражения. Обратите внимание, что функция чувствительна к регистру.

См. Этот вопрос и ответы для Как наилучшим образом определить MimeType файла :

1 голос
/ 13 января 2010

Я проголосовал за решение preg, но если вы действительно, ДЕЙСТВИТЕЛЬНО хотите знать, загрузите файл и опросите, используя системные функции (например, для Linux используйте file через exec).

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