miércoles, 19 de septiembre de 2012

CakePHP: Plugin para subir imágenes

Al fin pude descifrar una manera de subir imágenes en CakePHP 2.0. Probé este plugin de Jose Gonzalez y me funcionó adecuadamente. Puedo subir imágenes que se guardan en una estructura de carpetas fácilmente consultable por el identificador del modelo que se guarda en la base de datos. A parte genera los thumbnails en los tamaños que uno le defina.

Estos fueron los pasos que seguí:

1. Bajar el plugin.Se puede descargar el zip o bajar el código del repositorio de GitHub.

2. Se copia el código en la carpeta /app/Plugin/Upload (dejar la carpeta renombrada con Upload u otro nombre más amigable).

3. Se edita el "bootstrap.php" (/app/Config/) agregando la línea para habilitar el plugin:
CakePlugin::load('Upload');

4. En la base de datos, en la tabla donde se guarda la referencia a la foto, agregamos dos columnas: una para el identificador de la foto, y otra para el identificador del directorio:

CREATE TABLE  `mi_db`.`anuncios` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `titulo` varchar(45) NOT NULL,
  `id_foto` varchar(15) DEFAULT NULL,
  `dir` varchar(250) DEFAULT NULL,
)

5. En el modelo se configura las opciones para la subida de la imagen:

class Anuncio extends AppModel {
     
    public $actsAs = array(
        'Upload.Upload' => array(
            'id_foto' => array(
                'fields' => array(
                    'dir' => 'dir'
                ),                
                'thumbnailSizes' => array(
      'big' = '200x200',
                    'small' =>'120x120',
                    'thumb' =>'80x80'
                ),
                'thumbnailMethod'=> 'php'
            )
        )
    );
}

Observese que se configura los nombre de las columnas que configuramos en la tabla de nuestra base de datos, los tamaños de los thumbnails, y el método para crear los thumbnails (aquí uso php pues es una extensión que viene ya instalado por defecto en la mayoría de los ambientes de desarrollo tipo WAMP).

 6. Agrego el código de la vista:

<?php
 echo $this->Form->create('Anuncio', array('type' => 'file'));
 echo $this->Form->input('id_foto', array('type' => 'file', 'label' => 'Foto'));
 echo $this->Form->input('dir', array('type' => 'hidden'));
 echo $this->Form->end('Guardar Anuncio');
?>

7. ¡Listo! Las imágenes son guardadas dentro de 'webroot/files' (la ruta se puede configurar).


9 comentarios:

  1. Yo sigo con el problema brother, intenté utilizar tu código pero la parte del modelo me tira un error de sintaxis que no pude deducir.
    Error: syntax error, unexpected '=', expecting ')'
    File: C:\wamp\www\libreria\app\Model\libro.php
    Line: 15.
    Lo adapte para guardar fotos para una libreria. Si me das una mano te lo agradeceria porque no lo pude solucinar hace tres dias que estoy tratando de subir una foto.... gracias!

    ResponderEliminar
    Respuestas
    1. Saludos agusong!

      La clase Modelo le faltaba una llave para cerrar la clase. Quizás ese era el error que te daba.

      Eliminar
    2. Muchas Gracias Por contestar!!! Ahora lo pruebo de nuevo, ah sido un dolor de cabeza este pedazo de la aplicación, saludos! y comentaré de nuevo! Graciasss!

      Eliminar
  2. Gabriel, Muchas Gracias Lo probé y funciona correctamente, el error en el model que tuve fue corregir los = por =>.
    Graba todo en la base de datos perfectamente, muchas gracias por compartir esto y de explicarlo de manera tan sencilla y eficaz.
    Te hago una consulta de paso, sabes como hacer para crear una vista que muestre todos los datos con su foto correspondiente? al eliminar un libro (en mi caso), borrar las imagenes de la carpeta?
    Muchas Gracias!!! Muy bueno lo tuyo! Saludos

    ResponderEliminar
    Respuestas
    1. Aún no he llegado a ese punto. Pero para mostrar la foto debería ser una simple consulta a la BD para después armar la ruta completa de la imagen. Probablemente haré una entrada de eso en la próxima semana.

      Eliminar
  3. Hola, probé el código pero no funciona cuando voy a la base de datos encuentro que en el campo id_foto
    se encuentra almacenado el nombre de la imagen, pero el campo 'dir' se encuentra vacío.
    Alguna sugerencia? Estoy en ubuntu con un servidor apache, en un inicio pensé que era un problema de permisos y los asigne tanto a la carpeta del Plugin Upload como a webroot/files.

    Gracias :)

    ResponderEliminar
  4. HOla estoy desesperado me tira este error.

    Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Array' in 'field list'


    SQL Query: INSERT INTO `avenida`.`users` (`dir`, `id_foto`) VALUES ('', Array)

    ResponderEliminar
    Respuestas
    1. Suena como algún error en la clase Model. Quizás quedó como un atributo de clase mal declaradado que hace de ver que existe una columna llamada "Array".

      Eliminar
  5. Gracias, funciona correctamete, solo un error en 'big' = '200x200', en el publci acts del modelo, debe ser: 'big' =>'200x200', De resto todo bien, de nuevo gracias por el aporte.

    ResponderEliminar