Buenas,
hace unos días puse en marcha un servicio web para un cliente el cual queria subir una serie de ficheros e imágenes en alta resolución para que sus clientes y periodistas pudiesen usar esos recursos (son fotos de prendas de moda, descripciones de los fabricantes y demás) pero no querían algo que les hiciese perder mucho tiempo el hecho de actualizarlo (cada marca puede tener cientos de fotografias en alta resolución con peso de 2 a 5Mb cada una y algunos ficheros word o pdf).
Así que en vez de optar por un gestor se decidió hacer una pequeño explorador de FTP vía web, así simplemente debían subir las cosas con un cliente FTP a saco y sería la aplicación web la que haria la faena. Básicamente es eso, un explorador que permite ir recorriendo los directorios (mostrándolo un poco curioso todo) el cual muestra el contenido de cada carpeta (si son ficheros tal cual pues muestra el icono del programa con que se pueden abrir y si son imágenes las muestra en miniatura. Bueno, las imágenes no las muestra tal cual puesto que pesan un montón así que se creó un sistema para crear thumbnails de ellas y mostrarlas esas miniaturas.
El sistema funciona, si la imagen ya tiene thumbnail creado lo muestra y si es nueva y aún no tiene pues lo crea en ese momento y lo muestra. El problema radica con algunas imágenes de las cuales no hay cojones a crear el thumbnail, son jpeg como las demás (funciona tambien con gif o png) pero de algunas no lo crea (no es por tamaño de la imagen porque tengo el limite de PHP en 128Mb y se han creado correctamente thumbnails de imágenes mucho más pesadas). He intentado debugar un poco y PHP no lanza ningún error, por mucho que ponga el error_reporting(E_ALL) simplemente pasa de mi cara, se queda clavado en una linea (lo se porque he puesto un echo antes y un echo después y veo el primero pero no el segundo, la linea en concreto es la que pone:
$img = @imagecreatefromjpeg($filename)
El filename existe correctamente, puedo listar el fichero por ese nombre y me detecta que es un jpg puesto que esa linea está en un if para diferenciar jpg, png y gif.
Lo que me trae loco es que llega a esa linea y el script muere, no hace nada más, ni un error, ni nada.
Por si os sirve de algo os pongo el código del thumbnails.php que es el fichero que contiene dicha linea y donde se queda clavado al igual que dos de las imágenes con las que tengo problemas:
<?php
/*
ESTE ARCHIVO ES PARA USAR CON INCLUDE, PREVIAMENTE DEBE HABER DECLARADAS LAS SIGUIENTES VARIABLES:
$filename = archivo (incluida su ruta) del cual se quiere crear el thumbnail
$folder = carpeta destino del thumbnail
$thumbname = nombre que tendra el archivo thumbnail creado (MD5 HASH del original)
$ext = extension del thumbnail (PNG,JPEG,GIF) para crear el mismo tipo de thumbnail
$tamano = "big" o "small" si debemos crear el thumbnail grande (para preview) o pequeño (para listar en la tabla)
*/
// Override PHP.INI memory limit
ini_set("memory_limit","128M");
if(!file_exists($filename)) die('Error: El archivo no existe');
if(!function_exists('imagecreatetruecolor')) die('Error: GD2 no instalado / configurado');
$fn_array = explode('.', $filename);
$type = strtolower(end($fn_array));
if ($type == 'jpg' || $type == 'jpeg') {
$img = @imagecreatefromjpeg($filename);
}
elseif ($type == 'png') {
$img = @imagecreatefrompng($filename);
}
elseif ($type == 'gif') {
if(!function_exists('imagecreatefromgif')) die('Error: la version de la libreria GD no soporta GIF');
$img = @imagecreatefromgif($filename);
}
else die("Error: Tipo de imagen no soportado");
$x = imagesx($img);
$y = imagesy($img);
$calidad = "85";
switch ($tamano) {
case "big":
if($x > $y){
//si la imagen es mas ancha que alta
$width = 600;
$height = round(($y/$x) * $width);
}elseif($x < $y){
//si la imagen es mas alta que ancha
$height = 600;
$width = round(($x/$y) * $height);
}else{
//si la imagen es cuadrada
$width = 600;
$height = 600;
}
$calidad = "100";
break;
default:
if($x > $y){
//si la imagen es mas ancha que alta
$width = 150;
$height = round(($y/$x) * $width);
}elseif($x < $y){
//si la imagen es mas alta que ancha
$height = 150;
$width = round(($x/$y) * $height);
}else{
//si la imagen es cuadrada
$width = 150;
$height = 150;
}
$calidad = "85";
break;
}
$tmpimage = imagecreatetruecolor($width, $height);
imagecopyresampled($tmpimage, $img, 0, 0, 0, 0, $width, $height, $x, $y);
imagedestroy($img);
$img = $tmpimage;
//antess de guardar el fichero miramos si sera un thumbnail grande o pequeño para saber el nombre que tendra
switch ($tamano) {
case "big":
$plusname = "_big.";
break;
default:
$plusname = ".";
break;
}
if ($type == 'jpg' || $type == 'jpeg') {
//header("Content-type: image/jpeg");
imagejpeg($img,$folder . "/" . $thumbname. $plusname . $ext,$calidad);
imagedestroy($img);
}
elseif ($type == 'png') {
//header("Content-type: image/png");
imagetruecolortopalette($img, false, 128);
imagepng($img,$folder . "/" . $thumbname. $plusname . $ext,$calidad);
}
elseif ($type == 'gif') {
//header("Content-type: image/png");
imagetruecolortopalette($img, false, 128);
imagepng($img,$folder . "/" . $thumbname. $plusname . $ext,$calidad);
imagedestroy($img);
}
//liberamos memoria
$img = null;
?>
ejemplos de dos de las imágenes problemáticas: