我想检查另一个站点/服务器上托管的图像(如果在代码运行时是否存在)。为此,我使用的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
。所以代码是正确的但我的目标不是回复任何外部代码命中。它直接在浏览器中打开链接时显示图像。所以我的这个问题也包含答案。我会问另一个关于我的新问题的问题。
答案 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
中的标题(可能包含多组标题 - 全部合并为一个数组),这样您就可以看到实际投放的文件的标题。