PHP Обнаруживает, приводит ли ссылка на исходное изображение к «испорченному» изображению? - PullRequest
14 голосов
/ 09 сентября 2010

Предположим, у вас есть скрипт генератора миниатюр, который принимает исходные изображения в виде URL. Есть ли способ определить, не является ли исходный URL «неработающим» - несуществующим или приводит к отсутствию файла изображения?


Просто перебор с использованием getimagesize() или другой функции PHP GD не является решением, поскольку могут быть введены поддельные URL-адреса, которые могут вообще не быть изображениями (http://example.com/malicious.exe или одним и тем же файлом, но переименованы в http://example.com/malicious.jpg) - такие случаи могут быть легко обнаружены PHP перед тем, как вызывать GD. Я ищу GD для предварительной очистки, прежде чем GD попробует свой батальон при разборе файла.


в качестве первого шага следующее регулярное выражение проверяет, является ли URL расширением изображения: preg_match('@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)([^\s]+(\.(?i)(jpg|png|gif|bmp))$)@', $txt,$url);

Ответы [ 8 ]

11 голосов
/ 09 сентября 2010

используйте file_exists функцию в php, вы можете проверить URL с ее помощью.

См. Документацию ниже, показывает, как проверить img ... именно то, что вам нужно

ФАЙЛ СУЩЕСТВУЕТ - http://www.php.net/manual/en/function.file-exists.php#93572

URL EXISTS - http://www.php.net/manual/en/function.file-exists.php#85246


Вот альтернативный код для проверки URL.Если вы протестируете в браузере, замените \n на <br/>

<?php

$urls = array('http://www.google.com/images/logos/ps_logo2.png', 'http://www.google.com/images/logos/ps_logo2_not_exists.png');

foreach($urls as $url){
   echo "$url - ";
   echo url_exists($url) ? "Exists" : 'Not Exists';
   echo "\n\n";
}


function url_exists($url) {
    $hdrs = @get_headers($url);

    echo @$hdrs[1]."\n";

    return is_array($hdrs) ? preg_match('/^HTTP\\/\\d+\\.\\d+\\s+2\\d\\d\\s+.*$/',$hdrs[0]) : false;
}
?>

Вывод будет следующим:

http://www.google.com/images/logos/ps_logo2.png - Content-Type: image/png
Exists

http://www.google.com/images/logos/ps_logo2_not_exists.png - Content-Type: text/html; charset=UTF-8
Not Exists
7 голосов
/ 26 мая 2011

Я использовал следующее для обнаружения атрибутов для удаленных изображений

$src='http://example.com/image.jpg';
list($width, $height, $type, $attr) = @getimagesize($src);

пример (проверка стека overoverflow "Изображение Careers 2.0")

<code>$src='http://sstatic.net/ads/img/careers2-ad-header-so.png';
list($width, $height, $type, $attr) = @getimagesize($src);

echo '<pre>';
echo $width.'<br>';
echo $height.'<br>';
echo $type.'<br>';
echo $attr.'<br>';
echo '
';

Если $ height, $ width и т.д. равны нулю, изображение очевидно не является изображением или файл не существует. Использование cURL излишне и медленнее (даже с CURLOPT_HEADER)

3 голосов
/ 09 сентября 2010

Единственный действительно надежный способ - запросить изображение с помощью file_get_contents() и выяснить тип его изображения с помощью getimagesize().

Только если getimagesize() возвращает допустимый тип файла, вы можете полагать, что это действительно допустимое изображение.

Хотя это довольно ресурсоемкий.

Вы можете вообще не выполнять никаких проверок на стороне сервера и добавлять onerror событие JavaScript в готовый ресурс изображения:

<img src="..." onerror="this.style.display = 'none'">
1 голос
/ 23 января 2017

Быстрое решение для сломанных или не найденных изображений ссылка
Я предлагаю вам не использовать getimagesize (), потому что это будет 1-я загрузка изображения, тогда он проверит размер изображения +, если это не изображениетогда он выдаст исключение, поэтому используйте приведенный ниже код

if(checkRemoteFile($imgurl))
{
//found url, its mean
echo "this is image";
}

function checkRemoteFile($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);
    // don't download content
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    if(curl_exec($ch)!==FALSE)
    {
        return true;
    }
    else
    {
        return false;
    }
}

Примечание: этот текущий код поможет вам определить поврежденное или не найденное изображение URL, это не поможет вам определить тип изображения или заголовки

1 голос
/ 09 сентября 2010
try for local files

<?php 
if(file_exists($filename))
{
//do what you want
}
else
{
//give error that file does not exists
}
?>

для внешних доменов

$headers = @get_headers($url);
if (preg_match("|200|", $headers[0])) {
// file exists
} else {
// file doesn't exist
}

Также вы можете использовать запрос curl для того же.

0 голосов
/ 27 апреля 2019

Событие ошибки

Выполнить JavaScript, если при загрузке изображения возникает ошибка:

Событие onerror вызывается, если при загрузке внешнего файла (например, документа или изображения) возникает ошибка.

Пример:

<!DOCTYPE html>
<html>
<body>

<img src="image.gif" onerror="myFunction()">

<p>A function is triggered if an error occurs when loading the image. The function shows an alert box with a text.
In this example we refer to an image that does not exist, therefore the onerror event occurs.</p>

<script>
function myFunction() {
  alert('The image could not be loaded.');
}
</script>

</body>
</html>
0 голосов
/ 09 сентября 2010

вы пробовали метод file_get_contents ()?

http://php.net/manual/en/function.file-get-contents.php

0 голосов
/ 09 сентября 2010

Вы можете проверить код состояния HTTP (он должен быть 200) и заголовок типа содержимого (изображение / png и т. Д.) Ответа HTTP, прежде чем поставить фактическийизображение через генератор.

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

...