Erick Hernandez
unread,Aug 28, 2010, 6:51:58 PM8/28/10Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Sign in to report message
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
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