2

我正在使用 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="..." /> 

这有用吗?

任何帮助表示赞赏

4

5 回答 5

3

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

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

您还可以使用 CURL 检查 amimage或任何的 HTTP 响应代码URL

$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);
于 2012-05-07T21:20:59.673 回答
2
function fileExists($path){
    return (@fopen($path,"r")==true);
}

来自 file_exists() 的手册

于 2012-05-07T21:19:17.027 回答
2

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

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

于 2012-05-07T21:21:40.973 回答
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
}
于 2016-02-27T22:45:29.720 回答
0

以下函数将尝试使用 获取 URL 给出的任何在线资源(IMG、PDF 等)get_headers,读取标题并使用函数在其中搜索字符串“未找到” strpos。如果找到该字符串,表示 URL 给出的资源不可用,该函数将返回 FALSE,否则返回 TRUE。

function isResourceAvaiable($url)
{
  return !strpos(@get_headers($url)[0],'Not Found')>0;
}
于 2017-07-22T16:39:47.160 回答