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 ;但不会显示警告。


另一种解决方案是在使用 getimagesize 之前检查文件是否存在;这样的事情会做:

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

如果文件不存在,则不会调用 getimagesize -- 这意味着没有警告

不过,此解决方案不应该用于另一台服务器上的图像,并通过 HTTP 访问(如果您在这种情况下),因为这意味着对远程服务器的两个请求。

对于本地图像,我想这会很好;我看到的唯一问题是未屏蔽读取错误时生成的通知。


最后 :

  • 我会允许错误显示在您的开发服务器上,
  • 并且不会在您的生产服务器上显示那些 - 请参阅display_errors;-)
于 2009-09-01T18:41:25.847 回答
8

称我为会下地狱的肮脏黑客僵尸,但我通常通过将警告输出捕获到输出缓冲区然后检查缓冲区来解决这个问题。试试这个:

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"
}

就像我说的,这不是在程序员的天堂里得到一个舒适的地方,但是当涉及到功能失调的错误处理时,一个人必须做一个人必须做的事情。

于 2009-11-17T12:47:06.387 回答
7

很抱歉提出这么老的话题。最近遇到了类似的问题,发现this topic而不是一个解决方案。出于宗教原因,我认为“@”是错误的决定。然后我找到了另一个解决方案,它看起来像这样:

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 回答
0

这个解决方案对我有用。

try {
    if (url_exists ($photoUrl) && is_array (getimagesize ($photoUrl)))
    {
        return $photoUrl;
    }
} catch (\Exception $e) { return ''; }
于 2020-01-29T11:49:33.623 回答
0

基于其他答案的简单且有效的解决方案:

$img_url = "not-existing.jpg";

if ( is_file($img_url) && is_array($img_size = getimagesize($img_url)) ) {
  print_r($img_size);
  echo "OK";
} else {
  echo "NOT OK";
}
于 2022-02-18T12:50:09.383 回答