PHP - imagecreatefromjpeg detiene scrip

 
Vista:
sin imagen de perfil
Val: 5
Ha aumentado su posición en 27 puestos en PHP (en relación al último mes)
Gráfica de PHP

imagecreatefromjpeg detiene scrip

Publicado por Miguel Angel (3 intervenciones) el 10/06/2019 13:07:54
Hola a todos,

estoy intentando leer una imagen de tipo JPG que tengo almacenada previamente en el servidor para después poder procesarla, el tema es que al cargar la imagen con el comando imagecreatefromjpeg la ejecución se detiene sin mostrar ni error ni otra información adicional, imagino que por algún tipo de error interno que no consigo detectar.

Este es el fragmento de código que dar el error:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$size = filesize ($src_file);
$type = exif_imagetype($src_file);
if ( $type === IMAGETYPE_JPEG ) {
    try {
        $image = false;
        if  ( $image = @imagecreatefromjpeg($src_file) ) { //<-- Aqui es donde se detiene
            echo "{$src_file}: OK\r<br/>";
            return $image;
        } else {
            echo "{$src_file}: Error\r<br />";
        }
    } catch (Exception $e) {
        // aqui no entra nunca :-( 
        echo "{$src_file}: Error ",  $e->getMessage(), "\r<br />";
    }
}

El tema es que solo pasa con algunas imagenes no todas, y mostrando la información exif no consigo detectar cual es el problema, parece estar todo correcto y no suelen ser imagenes muy grandes aproximadamente unos 200 x 300 pixeles y los ficheros no sobrepasan de unas decenas de kilobytes.

¿Como puedo detectar el error en imagecreatefromjpeg()?

Gracias de antemano y saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 5
Ha aumentado su posición en 27 puestos en PHP (en relación al último mes)
Gráfica de PHP

imagecreatefromjpeg detiene scrip

Publicado por Miguel Angel (3 intervenciones) el 10/06/2019 18:20:19
Investigando un poco mas, he conseguido que me muestre el error que genera pero no consigo detectarlo. El error en particular es

Fatal error: imagecreatefromjpeg(): gd-jpeg: JPEG library reports unrecoverable error: Bogus marker length

y parece ser que se produce al subir las imágenes por FTP estas por algún motivo se corrompen en la subida, el tema es que al intentar procesarlas se genera el error automáticamente y se detiene la ejecución del script desde el propio comando imagecreatefromjpeg y ya no consigo detectarlo en el try .. catch
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

imagecreatefromjpeg detiene scrip

Publicado por Mauro (1034 intervenciones) el 10/06/2019 20:47:09
Algo que podrías hacer (al menos hasta ver un poco mejor de qué se trata) es calcular el md5 del archivo antes y después de subirlo... si no coinciden, efectivamente estás ante un problema en el FTP (Podría tratarse de alguna simple configuración mal hecha)...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 5
Ha aumentado su posición en 27 puestos en PHP (en relación al último mes)
Gráfica de PHP

imagecreatefromjpeg detiene scrip

Publicado por Miguel Angel (3 intervenciones) el 03/09/2019 19:18:38
Hola Mauro gracias por contestar, el modulo de FTP integra correción de errores, los problemas a la hora de leer las imagenes pueden ser de otras naturaleza, como formato JPG corruptos etc.

y el problema en particular es la libreria GD de PHP que parece que captura el error internamente y detiene la ejecución de todo el proceso sin dar lugar a que se pueda capturar dicha EXCEPCION externamente

He estado probando con esta función y sigo obteniendo el mismo problema al llamar a imagecreatefromstring cuando lo hace con un fichero que no puede leer sea por el motivo que sea, y entonces la ejecución se detiene y el proceso se para totalmente, siendo un engorro total

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
function checkImage($filename) {
 
	$errorMsg='';
	$result = false;
	try {
		if ($filename != "") {
			/* Abrimos el archivo según su contenido */
			try {
				$finfo = finfo_open(FILEINFO_MIME_TYPE);
				$infoFile = finfo_file($finfo, $filename);
			} finally {
				finfo_close($finfo);
			}
 
			try {
				$image = false;
				if (( $infoFile != 'image/jpeg' ) && ( $infoFile != 'image/png' )) {
					$errorMsg = "Formato de imagen no soportado";
				} elseif (!$image_data = file_get_contents($filename)) {
					$errorMsg = "Contenido no disponible";
				} elseif(!$image = imagecreatefromstring($image_data)) {
					/// si imagecreatefromstring produce un error, 
					/// se para totalmente la ejecucción y ya no entra 
					/// ni en el CATCH ni en el FINALLY
					$image = false;
					$errorMsg = error_get_last()['message'];
				} else {
			        unset($image);
					$errorMsg = '';
					$result = true;
				}
			} catch (Exception $e) {
				$image = false;
				$errorMsg = $e->getMessage();
			}
		} // if
	} finally {
		if ( !$result ) {
  		  echo "Errror {$errorMsg}: {$filename}<br />\r\n";
		}
		return $result;
	}
  } // function

ya probre con:
1
ini_set ('gd.jpeg_ignore_warning', 0);

y con un generador de excepciones:

1
2
3
4
set_error_handler(function ($no, $msg, $file, $line) {
		    echo __FILE__ . '(' . __LINE__ . "): {$file}({$line}): {$msg} \r<br/>\r";
			throw new ErrorException($msg , 0, $no, $file, $line);
	});

y de ninguna de las formas e obtenido resultados, en fin...
¿alguien mas con estos problemas?,
¿Alguna forma de decirle que deje pasar el error ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar