php - Manejar error cuando getimagesize no puede encontrar un archivo
try-catch (3)
cuando intento getimagesize($img)
y la imagen no existe, aparece un error. No quiero comprobar primero si el archivo existe, solo manejar el error.
No estoy seguro de cómo funciona la try catch
, pero quiero hacer algo como:
try: getimagesize($img) $works = true
catch: $works = flase
Como ha dicho, si se utiliza en un archivo no existente, getimagesize genera una advertencia:
Este código:
if ($data = getimagesize(''not-existing.png'')) {
echo "OK";
} else {
echo "NOT OK";
}
te conseguirá un
Warning: getimagesize(not-existing.png) [function.getimagesize]:
failed to open stream: No such file or directory
Una solución sería utilizar el operador @ , para enmascarar ese error:
if ($data = @getimagesize(''not-existing.png'')) {
echo "OK";
} else {
echo "NOT OK";
}
Como el archivo no existe, $ data seguirá siendo falso; pero no se mostrará ninguna advertencia.
Otra solución sería verificar si el archivo existe , antes de usar getimagesize; algo como esto haría
if (file_exists(''not-existing.png'') &&
($data = getimagesize(''not-existing.png''))
) {
echo "OK";
} else {
echo "NOT OK";
}
Si el archivo no existe, no se llama a getimagesize, lo que significa que no hay advertencia
Aún así, esta solución no es la que debe usar para las imágenes que se encuentran en otro servidor y se puede acceder a ellas a través de HTTP (si está en este caso), ya que significará dos solicitudes al servidor remoto.
Para las imágenes locales, eso estaría bastante bien, supongo; El único problema que veo es el aviso generado cuando hay un error de lectura que no se enmascara.
Finalmente :
- Permitiría que se muestren errores en su servidor de desarrollo,
- Y no los mostraría en su servidor de producción - vea
display_errors
, sobre eso ;-)
Llámeme un zombi pirata informático sucio que se irá al infierno, pero normalmente soluciono este problema capturando la salida de advertencia en un búfer de salida y luego revisando el búfer. Prueba esto:
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"
}
Como dije, no es la forma de obtener un lugar acogedor en el cielo de los programadores, pero cuando se trata del manejo disfuncional de errores, un hombre tiene que hacer lo que un hombre tiene que hacer.
Siento que haya planteado un tema tan viejo. Recientemente encontré un problema similar y encontré este tema en lugar de una solución. Por razones religiosas creo que ''@'' es una mala decisión. Y luego encontré otra solución, se ve algo así:
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;
}