2009-09-01 3 views
14

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

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

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

ответ

40

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

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


Другим решением было бы check if the file exists, перед использованием getimagesize; что-то, как это будет делать:

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

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

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

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


Наконец:

  • я позволил бы ошибки, которые будут отображаться на вашем сервере DEVELOPPEMENT,
  • И не будет отображать те на производственном сервере - см display_errors, об этом ;-)
+4

заметь, если file_exists() говорит, что файл существует, getimagesize() все еще может потерпеть неудачу, так как файл может быть удален только между вызовами методов. Виори маловероятно, но бывает в худшие моменты ... – ya23

+1

@ ya23: true; но вам бы очень не повезло ^^ И мне не нравятся маскирующие ошибки с @: если вы используете его, и у вас есть проблема, обычно это очень легко отлаживать :-( –

+1

Ну, я думаю, что @ pretty dirty :) – Gigala

7

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

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

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

+7

Вы грязный хакер-зомби, который отправится в ад. – Seb

5

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

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