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_headersphp関数を使用して、リクエストヘッダーを確認することも役立つ場合があります。

$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、ヘッダーを読み取り、関数を使用してその中の文字列「NotFound」を検索しようとしますstrpos。この文字列が見つかった場合、つまりURLで指定されたリソースが利用できない場合、この関数はFALSEを返します。それ以外の場合はTRUEを返します。

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