我想在代码运行时检查托管在另一个站点/服务器上的映像是否存在。出于这个目的,我使用的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代码,它运行得很好。但我想检查图像的地方不起作用。我的目标不包含域,它是一个类似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]"标头(它可能包含多组标头-全部合并到一个数组中),这将允许您查看实际服务的文件的标头。