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

时间:2014-09-17 15:39:05

标签: javascript php image

我想检查另一个站点/服务器上托管的图像(如果在代码运行时是否存在)。为此,我使用的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代码,并且它的工作正常。但我想检查图像的地方不起作用。我的目标不包含域,其IP地址如hhtp://XX.XX.XX.XX:XXXX/example.jpg。所以代码是正确的但我的目标不是回复任何外部代码命中。它直接在浏览器中打开链接时显示图像。所以我的这个问题也包含答案。我会问另一个关于我的新问题的问题。

4 个答案:

答案 0 :(得分:2)

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

<?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。这就是我一直以来的想法,快速的谷歌也显示了许多其他人。这是“传授知识,了解更多”的典型例子。

答案 1 :(得分:2)

最简单的答案是使用file_exists()函数,其中param是绝对文件路径,它返回true / false:

$isFileExists = file_exists($filePath);

答案 2 :(得分:2)

<?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;
?>

尝试以上代码。

答案 3 :(得分:1)

<强>更新

第二个想法,我错了。使用像GD这样的库是最简单,最可靠的方法。我想你可能只是使用错误的功能(或不使用GD?)。函数getimagesize返回描述资源的元素的数组。前两个指数是宽度和高度。该文档说,如果没有图像或多个图像或其他文件,宽度和高度将为0.所以你可以检查:

$img = getimagesize($url);
if($img[0] === 0)
   $imgFound = false;

或者您可以检查第三个索引(#2),即文件类型。要检查这一点,请将其与GD constants进行比较:

if($img[2] === IMG_JPG || $img[2] === IMG_JPEG)
    $imgFound = true;

确保已安装(检查phpInfo())。编辑:但docs表示不需要安装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));
}
?>

改进此脚本的一种方法是找到最后的&#34; HTTP / 1.1 [ERROR_CODE] [ERROR_MESSAGE]&#34; $http_response_header中的标题(可能包含多组标题 - 全部合并为一个数组),这样您就可以看到实际投放的文件的标题。