【问题标题】:How To Check An Image Exists Or Not Through PHP?如何通过 PHP 检查图像是否存在?
【发布时间】:2014-09-17 15:39:05
【问题描述】:

我想在代码运行时检查托管在另一个站点/服务器上的图像是否存在。为此,我使用的 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。所以代码是正确的,但我的目标没有回复任何外部代码命中。当我直接在浏览器中打开链接时,它会显示图像。所以我的这个问题也包含答案。我将就我的新问题提出另一个问题。

【问题讨论】:

  • getImageSize() 之前删除@。另外:php.net/manual/fr/function.file-exists.php
  • 你为什么不想使用file_get_contents?如果你使用它,你可以简单地检查魔术变量http_response_header,它将包含一个标题数组,包括一个错误代码(302 或 404 或其他)。对此不会有完美的解决方案,因为服务器可以根据需要响应您的请求,包括根本不响应。您可以做的最好的事情是查看服务器返回的标头。一个有用的标题是Content-Type: image/jpeg
  • allow_url_fopen 开启了吗? (见 phpinfo())
  • @djidi 按照您的提示后仍然无法正常工作...
  • @PascalOckert 是的,它在...

标签: javascript php image


【解决方案1】:

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

$isFileExists = file_exists($filePath);

【讨论】:

  • 我尝试了if (file_exists('http://www.example.com/example.jpg')) {echo "The file exists";} else {echo "The file does not exist";} 但没有工作...
【解决方案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;
?>

试试上面的代码。

【讨论】:

  • 我已经编辑了代码及其功能。祝你好运:)
  • example.com/example.jpg'; $file_headers = @get_headers($file); if($file_headers[0] == 'HTTP/1.1 404 Not Found') { $exists = false; } 其他 { $exists = true; } 回声 $exists; ?>
  • 所有答案现在都在工作,即使我的共享代码也在工作,所以选择正确的。我自己还是所有人?
  • 大声笑...好问题!它完全取决于你。无论您觉得对您有什么帮助,都可以标记。
【解决方案3】:

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

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

【讨论】:

  • getimagesize() 可以在没有 GD 库的情况下工作,请参阅 Notes
  • 我和你分享的代码都可以。问题是我的目标服务器没有回复任何外部 PHP 代码命中。当我尝试通过fsockopenfile_get_contentscurlget_headersGetImageSize 访问我的服务器时,它总是给Connection timed out
  • 检查服务器上的 80 端口是否对传出请求开放。
  • @AkhtharParvez 我的 80 端口未打开,但其他帖子已打开,因此我的目标图像 URL 是 http://XX.XX.XX.XX:XXXX/transparent.gif
【解决方案4】:

更新:

转念一想,我错了。使用像 GD 这样的库是最简单、最可靠的方法。我认为您可能只是错误地使用了该功能(或者没有使用 GD?)。函数getimagesize 返回描述资源的元素的array。前两个索引是宽度和高度。文档说如果没有图像或多个图像或其他文件,宽度和高度将为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));
}
?>

改进此脚本的一种方法是在 $http_response_header 中找到 LAST "HTTP/1.1 [ERROR_CODE] [ERROR_MESSAGE]" 标头(可能包含多组标头 - 全部合并到一个数组中),这将允许您可以查看实际服务的文件的标题。

【讨论】:

  • 使用您的代码后,我得到了{"imgFound":false},但我可以在浏览器中看到图像...
  • 这可能意味着响应代码不是 200 或 302 或者没有“Content-Type: image/jpeg”行。更新后的解决方案更适合您的目的。
  • @Muhammad 你提到了“favicon.ico”?这是否意味着您要获取的文件不是 jpg 或 jpeg? GD可能不支持。如果没有,您可以发布getimagesize 返回的数组吗?函数调用是否有效?
  • @我也更新了我的问题并确认我的共享代码没问题,但问题和旧的一样。我的目标服务器没有回复任何外部 PHP 代码命中。当我尝试通过fsockopenfile_get_contentscurlget_headersGetImageSize 访问我的服务器时,它总是给出Connection timed out。我的目标是JPG 图像。我只提到favicon.ico 是为了说明我正在点击小尺寸图片。
猜你喜欢
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 2012-04-14
  • 1970-01-01
  • 2015-03-07
  • 2014-06-24
相关资源
最近更新 更多