22

しようとしているときにgetimagesize($img)画像が存在しない場合、エラーが発生します。ファイルが存在するかどうかを最初に確認したくありません。エラーを処理するだけです。

どのようtry catchに機能するかはわかりませんが、次のようなことをしたいです:

try: getimagesize($img) $works = true
catch: $works = flase
4

5 に答える 5

53

あなたが言ったように、存在しないファイルで使用すると、 getimagesize は警告を生成します:

このコード:

if ($data = getimagesize('not-existing.png')) {
    echo "OK";
} else {
    echo "NOT OK";
}

あなたに

Warning: getimagesize(not-existing.png) [function.getimagesize]: 
  failed to open stream: No such file or directory 


解決策は、 @ 演算子 を使用してそのエラーをマスクすることです。

if ($data = @getimagesize('not-existing.png')) {
    echo "OK";
} else {
    echo "NOT OK";
}

ファイルが存在しないため、 $data は false のままです。ただし、警告は表示されません。


もう 1 つの解決策は、getimagesize を使用する前に、ファイルが存在するかどうかを確認することです。このようなことができます:

if (file_exists('not-existing.png') && 
    ($data = getimagesize('not-existing.png'))
   ) {
    echo "OK";
} else {
    echo "NOT OK";
}

ファイルが存在しない場合、getimagesize は呼び出されません。つまり、警告はありません。

それでも、このソリューションは、リモート サーバーへの 2 つの要求を意味するため、別のサーバー上にあり、HTTP 経由でアクセスする (この場合) 画像に使用するべきものではありません。

ローカル画像の場合、それで十分だと思います。私が目にする唯一の問題は、読み取りエラーがマスクされていないときに生成される通知です。


ついに :

  • 開発サーバーにエラーが表示されることを許可しますが、
  • そして、本番サーバーではそれらを表示しません-それについてはdisplay_errors、を参照してください;-)
于 2009-09-01T18:41:25.847 に答える
8

Call me a dirty hacker zombie who will be going to hell, but I usually get around this problem by catching the warning output into an output buffer, and then checking the buffer. Try this:

ob_start();
$data = getimagesize('not-existing.png');
$resize_warning = ob_get_clean();
if(!empty($resize_warning)) {
  print "NOT OK";
  # We could even print out the warning here, just as PHP would do
  print "$resize_warning";
} else {
  print "OK"
}

Like I said, not the way to get a cozy place in programmer's heaven, but when it comes to dysfunctional error handling, a man has to do what a man has to do.

于 2009-11-17T12:47:06.387 に答える
7

こんな古い話題ですみません。最近、同様の問題が発生し、代わりにこのトピックが解決策であることがわかりました。宗教上の理由から、「@」は悪い判断だと思います。そして、別の解決策を見つけました。それは次のようになります。

function exception_error_handler( $errno, $errstr, $errfile, $errline ) {
    throw new Exception($errstr);
}
set_error_handler("exception_error_handler");

try {
    $imageinfo = getimagesize($image_url);
} catch (Exception $e) {
    $imageinfo = false;
}
于 2014-09-02T11:52:39.253 に答える