Intereting Posts

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

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

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

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

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

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

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

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

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

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