Component para subir imagenes

112 views
Skip to first unread message

Erick Hernandez

unread,
Aug 28, 2010, 6:51:58 PM8/28/10
to CakePHP en Español
Buenas tardes, estaba tratando de encontrar una forma de subir
imágenes y a la final resolví por intentar hacerlo yo mismo y como
resultado cree un componente con esta función y me ha funcionado
perfectamente.

El codigo del archivo es el siguiente:

[imagenes.php]

<?php

class ImagenesComponent extends Object {
function subirImg($data, $directorio="img/", $tipo=0, $anchoMin=0,
$altoMin=0, $anchoGr=0, $altoGr=0, $logo=false){

$archivo = md5(uniqid(rand(), true));

$nom_foto = substr($archivo, 2, 15);
$nombre =$nom_foto.".jpg";

if (move_uploaded_file($data['tmp_name'], $directorio.$nombre)){

$url= $nombre;

$grande = imagecreatefromjpeg($directorio.$nombre);

$ancho4 = imagesx($grande);

$alto4 = imagesy($grande);

$size = getimagesize($directorio.$nombre);

$width=$size[0];

$height=$size[1];

if($altoGr == "0"){

$newwidth = $anchoGr;

$newheight=$height*$newwidth/$width;

}elseif($anchoGr == "0"){

$newheight=$altoGr;

$newwidth = $width*$newheight/$height;

}else{

$newheight=$altoGr;

$newwidth = $width*$newheight/$height;

if($newwidth < $anchoGr){

$newwidth = $anchoGr;

$newheight=$height*$newwidth/$width;

}

}

if($anchoGr != 0 and $altoGr != 0){

$redimension = imagecreatetruecolor($newwidth,$newheight);

imagecopyresampled($redimension,$grande,0,0,0,0,$newwidth,
$newheight,$ancho4,$alto4);

imagejpeg($redimension,$directorio.$nombre,90);

}



if($logo){

$imagen_logo = imagecreatefrompng($logo);

$ancho_logo = imagesx($imagen_logo);

$alto_logo = imagesy($imagen_logo);



$imagen_dest = imagecreatefromjpeg($directorio.$nombre);

$ancho_dest = imagesx($imagen_dest);

$alto_dest = imagesy($imagen_dest);



$ancho_muestra = ($ancho_dest - $ancho_logo) - 10;

$alto_muestra = ($alto_dest - $alto_logo) - 10;



imagecopyresized($imagen_dest,$imagen_logo,$ancho_muestra,
$alto_muestra,0,0,$ancho_logo,$alto_logo,$ancho_logo,$alto_logo);

imagejpeg($imagen_dest,$directorio.$nombre,75);

}



if($tipo == "1"){

$original = imagecreatefromjpeg($directorio.$nombre);

$ancho = imagesx($original);

$alto = imagesy($original);

if($altoMin == "0"){

$newwidth = $anchoMin;

$newheight=$height*$newwidth/$width;

}elseif($anchoMin == "0"){

$newheight=$altoMin;

$newwidth = $width*$newheight/$height;

}else{

$newwidth = $anchoMin;

$newheight = $altoMin;

}

$thumb = imagecreatetruecolor($newwidth,$newheight);

imagecopyresampled($thumb,$original,0,0,0,0,$newwidth,$newheight,
$ancho,$alto);

$nombrethumb = "thumb_".$nombre;

imagejpeg($thumb,$directorio.$nombrethumb,90); // 90 es la calidad
de compresión

}elseif($tipo == 2){

$original = imagecreatefromjpeg($directorio.$nombre);

$ancho = imagesx($original);

$alto = imagesy($original);

if($altoMin == "0"){

$newwidth = $anchoMin;

$newheight=$height*$newwidth/$width;

}elseif($anchoMin == "0"){

$newheight=$altoMin;

$newwidth = $width*$newheight/$height;

}else{

$newheight=$altoMin;

$newwidth = $width*$newheight/$height;

if($newwidth > $anchoMin){

$newwidth = $anchoMin;

$newheight=$height*$newwidth/$width;

}

}



$thumb = imagecreatetruecolor($newwidth,$newheight);

imagecopyresampled($thumb,$original,0,0,0,0,$newwidth,$newheight,
$ancho,$alto);

$nombrethumb = "thumb_".$nombre;

imagejpeg($thumb,$directorio.$nombrethumb,90); // 90 es la calidad
de compresión

}

return $url;

}else{

$url="";

return $url;

}

}
}

?>

Explico como funciona.

En su controlador:
Primero que nada este archivo (imagenes.php) debe estar dentro de /app/
controllers/components/
Luego, dentro de la variable $components de su controlador deben
agregar este nuevo componente:
var $components = array('Imagenes');
En su funcion add() o adit() o donde quiera que la vayan a usar el
componente van a colocar lo siguiente:
$this->data['Modulo']['CampoImg'] = $this->Imagenes->subirImg($this-
>data['Modulo']['CampoImg']);
Este es el comportamiento mas basico, con esto simplemente suben la
imagen al servidor tal cual como la tenian en su pc solo que con un
nombre generado por el sistema, además lo estamos guardadndo en el
$data para que guarde el nombre en la base de datos.

En su vista:
Primero que nada deben decirle al formulario que se va a enviar
archivos:
<?php echo $form->create('Modulo', array('enctype'=>"multipart/form-
data"));?>
creamos todo igual que siempre y agregamos el campo file como uno mas:
<?php echo $form->input('CampoImg', array('type' => 'file'));?>
Y con eso estamos listos.

Ahora mas avanzado.
El componente es capaz de mas que solo subir la imagen, también puede
crear una miniatura pasándole el tamaño que queremos para ella,
también podemos decirle de que tamaño queremos la grande e incluso
podemos ponerle nuestro logo en una esquina.

Opciones:
$data = Ya lo vimos arriba, es la variable $this->data['Modulo']
['CampoImg']
$directorio = El lugar donde queremos que se guarde la foto, por
defecto se guarda en webroot/img/
$tipo= las opciones son las siguientes:
0.- Sin miniatura (por defecto)
1.- Con miniatura de medidas estricta (ejm si dicen 100x100
sera asi incluso deformando la imagen)
2.- Con miniatura de relacion de aspecto (ejm si dicen
100x100 pero la imagen es rectangular colocara una de los lados en 100
y el otro lo colocara en proporcion)
$anchoMin= Ancho para las miniaturas (por defecto 0)
$altoMin= Alto para las miniaturas (por defecto 0)
$anchoGr= Ancho para la imagen grande (por defecto 0)
$altoGr= Alto para la imagen grande (por defecto 0)
$logo= Ruta de el logo que deseamos colocar (solo acepta png) (por
defecto false)

Por desgracia este componente solo acepta imágenes JPG por ahora, si
quieren pueden completarlo para que acepte otros formatos, aunque por
mi experiencia los archivos png no pueden redimensionarse.
Yo tenia una versión que aceptaba además archivos gif y bmp pero de
verdad no recuerdo donde esta y me da flojera hacer esos cambios en
este momento (además por ahora me sirve así jejeje).

Bueno, si tienen alguna duda me comentan

Erick Hernandez

unread,
Aug 28, 2010, 6:58:54 PM8/28/10
to CakePHP en Español
Se me olvido agregar que las miniaturas se guardan en el mismo
directorio y con el mismo nombre de la imagen solo que con el prefijo
"thumb_" (sin las comillas), por lo que no se guarda en la base de
datos, para llamarla solo basta con llamar la imagen grande y
anteponerle el prefijo

Rodrigo Yardin

unread,
Aug 29, 2010, 9:01:00 PM8/29/10
to cakep...@googlegroups.com
Excelente aporte!

--
Has recibido este mensaje porque estás suscrito al grupo "CakePHP en Español" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a cakep...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a cakephp-esp...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/cakephp-esp?hl=es.




--
Rodrigo Yardín

Felipe Nicolas Alvarado Diaz

unread,
May 25, 2016, 2:21:00 PM5/25/16
to CakePHP en Español, takashi...@gmail.com
Erick, resolviste el problema para poder subir otros tipos de extenciones??

Saludos
Reply all
Reply to author
Forward
0 new messages