检查PHP是否存在远程图像

时间:2012-05-07 21:12:07

标签: php html image

我正在使用last.fm API来获取最近的曲目以及搜索专辑和艺术家等。 从API返回图像时,它们有时不存在。一个空的URL字符串很容易被占位符图像替换,但是当给出一个图像URL并且它返回404时,那就是我的问题进入时。

我尝试使用fopen($ url,'r')检查图像是否可用,但有时会出现以下错误:

Warning: fopen(http://ec1.images-amazon.com/images/I/31II3Cn67jL.jpg) [function.fopen]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in file.php on line 371

此外,我不想使用cURL,因为要检查的图像很多,它会使网站速度减慢。

检查图像的最佳解决方案是什么? 我现在正在使用以下解决方案:

 <img src="..." onerror='this.src="core/img/no-image.jpg"' alt="..." title="..." /> 

这有用吗?

感谢任何帮助

5 个答案:

答案 0 :(得分:3)

您可以使用getimagesize,因为您正在处理图像,它也会返回图像的mime类型

   $imageInfo = @getimagesize("http://www.remoteserver.com/image.jpg");

您还可以使用CURL检查上午image或任何URL

的HTTP响应代码
$ch = curl_init("http://www.remoteserver.com/image.jpg");
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 2);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
curl_exec($ch);
if(curl_getinfo($ch, CURLINFO_HTTP_CODE) == 200)
{
    // Found Image
}
curl_close($ch);

答案 1 :(得分:2)

function fileExists($path){
    return (@fopen($path,"r")==true);
}

来自file_exists()的手册

答案 2 :(得分:2)

根据图像数量和故障频率,最好坚持使用当前的客户端方法。此外,看起来图像是通过Amazon CloudFront提供的 - 在这种情况下,使用客户端方法,因为它可能只是单边服务器的传播问题。

应用服务器端方法将是网络密集且速度慢(浪费资源),尤其是在php中,因为您需要按顺序检查每个图像。

答案 3 :(得分:1)

使用get_headers php函数检查请求标头也可能有用,如下所示:

$url = "http://www.remoteserver.com/image.jpg";
$imgHeaders = @get_headers( str_replace(" ", "%20", $url) )[0];

if( $imgHeaders == 'HTTP/1.1 200 Ok' ) {
    //img exist
}
elseif( $imgHeaders == 'HTTP/1.1 404 Not Found' ) {
    //img doesn't exist
}

答案 4 :(得分:0)

以下函数将尝试使用get_headers获取URL提供的任何在线资源(IMG,PDF等),读取标题并搜索字符串“未找到”#39;在其中使用函数strpos。如果找到此字符串,意味着URL提供的资源不可用,则此函数将返回FALSE,否则为TRUE。

function isResourceAvaiable($url)
{
  return !strpos(@get_headers($url)[0],'Not Found')>0;
}