检查远程 URL 上是否存在图像

问题描述 投票:0回答:10

我正在为书籍 ISBN 生成图像的动态 URL。我需要一种可靠的 PHP 方法来检查图像是否确实存在于远程 url 中。我用不同的 PHP 库、curl 等尝试了各种方法,但没有一种效果很好,其中一些非常慢。鉴于我需要为我的数据库中的每本书生成(并检查!)大约 60 个 URL,这是一个巨大的等待时间。有什么线索吗?

php url image curl
10个回答
118
投票
function checkRemoteFile($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);
    // don't download content
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $result = curl_exec($ch);
    curl_close($ch);
    if($result !== FALSE)
    {
        return true;
    }
    else
    {
        return false;
    }
}

--> 如果你的主机支持 curl,这是最快的方法


66
投票

像这样使用 getimagesize() 方法

$external_link = ‘http://www.example.com/example.jpg’;
if (@getimagesize($external_link)) {
echo  “image exists “;
} else {
echo  “image does not exist “;
}

6
投票

这里没有“简单”的方法 - 至少,您需要生成一个

HEAD
请求并检查生成的内容类型以确保它是图像。这没有考虑可能的推荐人问题。卷曲是去这里的方式。


4
投票

你可以使用 curl。只需将 curl 选项 CURLOPT_NOBODY 设置为 true。这将跳过主体信息,只获取头部(因此也是 http 代码)。然后,您可以使用 CURLOPT_FAILONERROR 将整个过程变成真/假类型检查


4
投票

我一直在为我的房地产图片跟踪做这个......

$im = @imagecreatefromjpeg($pathtoimg);
if($im)
  imagedestroy($im); // dont save, just ack...
elseif(!$missing[$inum])
  $img404arr[] = $inum;

“似乎”比下载实际图像更快,平均 100k 的图像每张大约需要 0.3 秒。

我希望我可以做一个标题检查并阅读我是否得到 200 和 404 而无需下载任何东西。有人手边有吗?



1
投票

在这一点上可能没有实际意义,但这对我有用:

function is_webfile($webfile)
{
 $fp = @fopen($webfile, "r");
 if ($fp !== false)
  fclose($fp);

 return($fp);
}

0
投票

解决方案来自https://www.experts-exchange.com

<?php
function url_exists($url) {
    if (!$fp = curl_init($url)) return false;
    return true;
}
?>

0
投票

我正在使用它并自己根据以上所有答案进行修改。退出或不退出图像,但我们还必须处理上面答案中缺少的错误。

这是我正在使用的:

function checkRemoteFile($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // follow redirects

    // Set a maximum timeout of 10 seconds to prevent the script from hanging
    curl_setopt($ch, CURLOPT_TIMEOUT, 10); 

    // Execute the request and get the HTTP status code
    curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    curl_close($ch);

    // Check the HTTP status code
    if($httpCode >= 200 && $httpCode < 300) {
        // The file exists and the server returned a successful HTTP status code
        return true;
    } else {
        // The file does not exist or the server returned an error HTTP status code
        return false;
    }
}

-1
投票

如果图像都存在于同一个远程服务器(或同一个网络),您可以在该服务器上运行一个 Web 服务,该服务将检查图像文件的文件系统并返回一个 bool 值,指示图像是否存在或不是。

© www.soinside.com 2019 - 2024. All rights reserved.