如何通过PHP检查图像是否存在


How To Check An Image Exists Or Not Through PHP?

我想在代码运行时检查托管在另一个站点/服务器上的映像是否存在。出于这个目的,我使用的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做与上面代码相同的事情。我不想使用fsockopenfile_get_contentscurlget_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代码,它运行得很好。但我想检查图像的地方不起作用。我的目标不包含域,它是一个类似hhtp://XX.XX.XX.XX:XXXX/example.jpg的IP地址。所以代码是正确的,但我的目标没有回复任何命中的外部代码。当我直接在浏览器中打开链接时,它会显示图像。所以我的这个问题也包含答案。关于我的新问题,我会再问一个问题。

您粘贴的以下代码应该适用于您:

<?php
$url = 'http://www.example.com/example.jpg';
if (@GetImageSize($url)) {
echo  "Image Is Available";
} else {
echo  "Image Is Not Available";
}
?>

更新时间:确保到端口80(或用于传出http请求获取映像的任何端口)的传出请求在服务器上未被阻止。

注意:感谢Pascal Ockert指出GetImageSize不需要GD。这就是我一直以来的想法,谷歌的快速搜索也表明了这一点。这是"传递知识,学到更多"的经典例子。

最简单的答案是使用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;
?>

试试上面的代码。

更新:

转念一想,我错了。使用像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())。编辑:然而,文档说,使用getimagesize不需要安装GD扩展,但只有安装了它,常量才可用。

原始答案

正如我在评论中所说,如果你不能控制托管映像的服务器,就没有完美的方法来做到这一点,因为它可以随心所欲地响应你的请求(拒绝、重定向等)。但你可以使用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_response_header中找到LAST"HTTP/1.1[ERROR_CODE][ERROR_MESSAGE]"标头(它可能包含多组标头-全部合并到一个数组中),这将允许您查看实际服务的文件的标头。