当getimagesize找不到文件时处理错误

Joh*_*han 19 php try-catch getimagesize

当我尝试getimagesize($img)并且图像不存在时,我收到错误.我不想先检查文件是否存在,只是处理错误.

我不确定它是如何try catch工作的,但我想做的事情如下:

try: getimagesize($img) $works = true
catch: $works = flase
Run Code Online (Sandbox Code Playgroud)

Pas*_*TIN 45

就像你说的,如果在一个不存在的文件上使用,getimagesize会生成一个警告:

这段代码:

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

会得到你的

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


解决方案是使用@运算符来屏蔽该错误:

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

由于该文件不存在,$ data仍然是false; 但不会显示任何警告.


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

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

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

尽管如此,这个解决方案不是你应该用于另一台服务器上的图像,而是通过HTTP访问的(如果你是这种情况),因为它意味着对远程服务器的两个请求.

对于本地图像,我想这很好; 我看到的唯一问题是当没有屏蔽读取错误时产生的通知.


最后:

  • 我会允许在您的开发服务器上显示错误,
  • 并且不会在生产服务器上显示那些 - 请参阅display_errors,关于那个;-)

  • 请注意,如果file_exists()告诉文件存在,getimagesize()可能仍会失败,因为文件可能只是在方法调用之间被删除.Veeery不太可能,但在最糟糕的时刻发生...... (5认同)
  • @ya23:正确;但你一定很不幸 ^^ 而且我不喜欢用 @ 掩盖错误:如果你正在使用它,并且遇到问题,那么调试通常很快就会很痛苦:-( (2认同)
  • 我建议使用is_file()而不是file_exists(),因为如果传递的值是目录,后者将为true.假设某些错误文件名为空,如果目录存在,则file_exists()将为true.`file_exists( '/ true_path /'); // ==> true``is_file('/ true_path /'); // ==> false` (2认同)

小智 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"
}
Run Code Online (Sandbox Code Playgroud)

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

  • 你是一个肮脏的黑客僵尸谁会下地狱. (8认同)

out*_*ead 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;
}
Run Code Online (Sandbox Code Playgroud)