когда я пытаюсь 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; }