Я хочу проверить изображение, размещенное на другом сайте / сервере, если оно существует или нет на момент запуска кода. Для этой цели я использую JavaScript, который отлично работает с моим желанием, которым я поделюсь ниже. Но некоторые браузеры не поддерживают JavaScript, или некоторые пользователи используют блокирующие расширения для блокировки JavaScript, поэтому в то время мой код выполнялся.
<script type='text/javascript'>
var url = 'http://www.example.com/example.jpg';
var img = new Image();
img.src = url;
img.onload = function()
{
alert('Image Is Available')
}
img.onerror = function()
{
alert('Image Is Not Available')
}
</script>
Так что теперь я хочу сделать то же самое, что и в приведенном выше коде, но на чистом PHP. Я не хочу использовать fsockopen
, file_get_contents
, curl
, get_headers
возможность нажать и проверить сервер. Я только хочу нажать на изображение и проверить это, как указано выше. Для этой цели я использовал приведенный ниже код, но он не работает. Его показ Image Is Not Available
даже я могу открыть изображение прямо в браузере. Я нашел этот код через Интернет.
<?php
$url = 'http://www.example.com/example.jpg';
if (@GetImageSize($url)) {
echo "Image Is Available";
} else {
echo "Image Is Not Available";
}
?>
Так в чем же ошибка в этом коде? Можете ли вы упомянуть и решить … ???
Обновить: Пожалуйста, не упоминайте время загрузки или размер изображения, когда я нажимаю favicon.ico
или другие изображения небольшого размера на моей цели.
Важная проблема: Я проверяю приведенный выше PHP-код на другой цели, и он отлично работает. Но там, где я хочу проверить, изображение не работает. Моя цель не содержала домен, его IP-адрес, как hhtp://XX.XX.XX.XX:XXXX/example.jpg
, Так что код верен, но моя цель не отвечает ни на какие внешние коды. Это отображение изображения, когда я открываю ссылку прямо в браузере. Так что мой этот вопрос также содержит ответ. Я задам еще один вопрос о моей новой проблеме.
Самый простой ответ — использовать функцию file_exists (), где param будет абсолютным путем к файлу, он возвращает true / false:
$isFileExists = file_exists($filePath);
<?php
$file = 'http://www.example.com/example.jpg';
$file_headers = @get_headers($file);
if($file_headers[0] == 'HTTP/1.1 404 Not Found') {
$exists = false;
}
else {
$exists = true;
}
echo $exists;
?>
Попробуйте приведенный выше код.
Приведенный ниже код должен работать на вас:
<?php
$url = 'http://www.example.com/example.jpg';
if (@GetImageSize($url)) {
echo "Image Is Available";
} else {
echo "Image Is Not Available";
}
?>
Обновлено:
Убедитесь, что исходящие запросы на порт 80 (или любой другой порт, который вы используете для исходящего http-запроса для получения образа) не заблокированы на сервере.
Примечание: спасибо Паскалю Окерту за указание на то, что GetImageSize не требует GD. Это было то, что я думал все это время, и быстрый Google показывает, что многие другие тоже. Это классический пример «передать знания, чтобы узнать больше».
Обновить:
На вторую мысль я ошибся. Использование библиотеки, такой как GD, — самый простой и надежный способ сделать это. Я думаю, что вы можете просто неправильно использовать функцию (или не использовать GD?). Функция getimagesize
возвращает массив элементов, описывающих ресурс. Первые два индекса — это ширина и высота. В документе сказано, что если изображения, нескольких изображений или какого-либо другого файла нет, ширина и высота будут равны 0. Таким образом, вы можете проверить, что:
$img = getimagesize($url);
if($img[0] === 0)
$imgFound = false;
Или вы можете проверить третий индекс (# 2), который является типом файла. Чтобы проверить это, вы сравните это с GD константы:
if($img[2] === IMG_JPG || $img[2] === IMG_JPEG)
$imgFound = true;
Просто убедитесь, что он установлен (проверьте phpInfo()
). Изменить: документы однако говорят, что расширение GD не нужно устанавливать, чтобы использовать getimagesize
, но константы будут доступны только при установке.
Оригинальный ответ:
Как я сказал в своем комментарии, нет идеального способа сделать это, если у вас нет контроля над сервером, на котором размещено изображение, поскольку он может отвечать на ваш запрос, как ему нравится (отклонить его, перенаправить и т. Д.). Но вы можете использовать file_get_contents
получить файл (который возвращает false
в случае неудачи), а затем проверьте заголовки, используя $http_response_header
чтобы увидеть, если это изображение. Вот пример сценария:
<?php
$url = 'http://www.example.com/example.jpg';
// some servers will do a redirect to a valid image page,
// so you don't want to reject a 302 necessarily.
$okCodes = array("200", "302");
$imgFound = false;
$pic = file_get_contents($url);
if($pic !== false) {
if(isset($http_response_header[0])) {
$firstHeader = explode(" ", $http_response_header[0]);
if(isset($firstHeader[1]) and in_array($firstHeader[1], $okCodes)) {
$count = count($http_response_header);
for($j = 0; $j < $count; ++$j) {
if(strpos($http_response_header[$j], "Content-Type: image/jpeg") !== false
|| strpos($http_response_header[$j], "Content-Type: image/jpg") !== false) {
$imgFound = true;
}
}
}
}
}
// and if you're using ajax, echo it back to your app
if($imgFound) {
echo json_encode(array("imgFound" => true));
} else {
echo json_encode(array("imgFound" => false));
}
?>
Один из способов улучшить этот сценарий — найти в ПОСЛЕДНЕМ заголовке «HTTP / 1.1 [ERROR_CODE] [ERROR_MESSAGE]» $http_response_header
(который может содержать несколько наборов заголовков — все объединены в один массив), что позволит вам увидеть заголовки для файла, который вы фактически обслуживаете.