Ошибка обработки, когда getimagesize не может найти файл

когда я пытаюсь getimagesize($img), и изображение не существует, я получаю сообщение об ошибке. Я не хочу сначала проверять, существует ли файл, просто обрабатывать ошибку.

Я не уверен, как работает try catch, но я хочу сделать что-то вроде:

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

Ответы

Ответ 1

Как вы сказали, если используется в несуществующем файле, 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";
}

Поскольку файл не существует, данные $будут по-прежнему ложными; но предупреждение не будет отображаться.


Другое решение - проверить, существует ли файл, перед использованием getimagesize; что-то вроде этого:

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

Если файл не существует, getimagesize не вызывается - что означает отсутствие предупреждения

Тем не менее, это решение не та, которую вы должны использовать для изображений, которые находятся на другом сервере, и доступ через HTTP (если вы в этом случае), так как это будет означать два запроса на удаленный сервер.

Для локальных изображений, я думаю, это было бы вполне нормально; только проблема, которую я вижу, - это уведомление, генерируемое при отсутствии ошибки чтения.


Наконец:

  • Я бы допустил, чтобы ошибки отображались на вашем сервере разработки,
  • И не будет отображаться на вашем рабочем сервере - см. display_errors, о котором: -)

Ответ 2

Позвоните мне, грязный хакер-зомби, который отправится в ад, но я обычно обойду эту проблему, поймав вывод предупреждения в выходной буфер, а затем проверив буфер. Попробуйте следующее:

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

Как я уже сказал, не способ получить уютное место в небесах программистов, но когда дело доходит до дисфункциональной обработки ошибок, мужчина должен делать то, что должен делать мужчина.

Ответ 3

Мне жаль, что поднимаю такую ​​старую тему. Недавно столкнулся с аналогичной проблемой и нашел эту тему вместо решения. По религиозным соображениям я считаю, что "@" - это плохое решение. И затем я нашел другое решение, оно выглядит примерно так:

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