当我尝试getimagesize($img)
且图片不存在时,我收到错误消息。我不想先检查文件是否存在,只是处理错误。
我不确定try catch
是如何工作的,但我想做的事情如下:
try: getimagesize($img) $works = true
catch: $works = flase
答案 0 :(得分:44)
如您所说,如果在不存在的文件上使用,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
解决方案是使用@ operator来掩盖该错误:
if ($data = @getimagesize('not-existing.png')) {
echo "OK";
} else {
echo "NOT OK";
}
由于该文件不存在,$ data仍然是false;但不会显示任何警告。
在使用getimagesize之前,另一个解决方案是check if the file exists;像这样的事情会:
if (file_exists('not-existing.png') &&
($data = getimagesize('not-existing.png'))
) {
echo "OK";
} else {
echo "NOT OK";
}
如果文件不存在,则不会调用getimagesize - 这意味着没有警告
但是,这个解决方案不是你应该用于另一台服务器上的图像,而是通过HTTP访问的(如果你是这种情况),因为它意味着对远程服务器的两个请求。
对于本地图像,我想这很好;我看到的唯一问题是当没有屏蔽读取错误时产生的通知。
最后:
display_errors
,关于此; - )答案 1 :(得分: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"
}
就像我说的那样,不是在程序员的天堂里获得一个舒适的地方的方式,但是当涉及到功能失调的错误处理时,一个人必须做一个男人必须做的事情。
答案 2 :(得分:6)
对不起,提出这么老的话题。最近遇到了类似的问题,发现这个话题代替了解决方案。出于宗教原因,我认为' @'是不好的决定。然后我找到了另一个解决方案,它看起来像这样:
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;
}
答案 3 :(得分:0)
此解决方案对我有效。
try {
if (url_exists ($photoUrl) && is_array (getimagesize ($photoUrl)))
{
return $photoUrl;
}
} catch (\Exception $e) { return ''; }