El verdadero rico no es el que tiene mucho dinero sino el que tiene tiempo para estar con la gente que quiere y hacer lo que le gusta.

Subir archivos en CakePHP con el Plugin Upload

Subir archivos en CakePHP con el Plugin Upload

Publicado el 26 Noviembre, 2014 por | Categoría:

La funcionalidad de subir archivos puede llegar a ser una de las necesidades mas comunes dentro de nuestra aplicación web, pero a la misma vez puede ser un dolor de cabeza ya que no solo consiste en ingresar un campo input de tipo file para poder subir cualquier tipo de archivo, esto va mas allá porque debemos tener cuidado con los tipos de archivos que sube el usuario, debemos también tomar en cuenta el peso de los archivos para no sobrecargar nuestro servidor, entre otros aspectos. En CakePHP podemos realizar un módulo para subir todo tipo de archivos pero esto implica tomar en cuenta todo tipo de validaciones, realizar bastantes pruebas y sobre todo una gran inversión de tiempo.

Por fortuna y de hecho lo mas alucinante de la web es crear comunidad y CakePHP ya es un framework suficientemente maduro que cuenta con una gran comunidad, entre ellos desarrolladores que apoyan en nuevos módulos y funcionalidades del framework como también desarrollo de plugins, puedes darte una vuelta por la página de plugins disponibles para CakePHP donde te encontraras con una amplia lista de plugins disponibles para su uso.


Esta vez quiero hablarte de un plugin en particular que nos va ser muy útil para realizar un completo upload de archivos, te hablo del plugin Upload desarrollado por Jose Gonzalez una de las personas mas activas en el mundo de CakePHP, este plugin nos solventará muchos de los dolores de cabeza que puede traer crear un completo módulo para subir nuestros archivos, es bastante completo e intuitivo de implementar, cuenta con una amplia documentación donde encontraras ejemplos y distintas maneras de poder configurar el comportamiento del plugin acorde a las necesidades de la aplicación.

Continuando con el Curso de desarrollo de aplicaciones web con el framework CakePHP en este video vamos desarrollar un completo upload de imágenes apoyándonos en el plugin que acabo de mencionar, en concreto, vamos a trabajar en nuestro módulo de platillos en el que permitiremos al usuario poder subir una foto del platillo registrado, esto con el fin de obtener una mejor visualización del platillo a preparar u ordenar, vamos a aplicar las principales funcionalidades que nos traer el Plugin Upload de tal forma que podamos  realizar una correcta carga de nuestras imágenes de platillos.

A continuación te dejo el video 11 donde te hablo de todo lo mencionado anteriormente y otras características más puestas a la práctica:

Ahora dime tú, que te pareció la implementación del Plugin Upload dentro de nuestra aplicación del restaurante? en lo personal me pareció bastante útil y completo ya que cubre muchas de las necesidades para poder subir de manera correcta una archivo ya sea imagen o de cual otro tipo de archivo, como siempre recomendarte revisar la documentación de este plugin y desde luego mucha práctica. Te animo a que dejes un comentario acá abajo contándome tu experiencia, opiniones o sugerencias que siempre serán bienvenidas.

Para finalizar sugiero que no te pierdas los próximos vídeos que estaré publicando periódicamente en mi blog y si te pareció interesante el artículo y el video no dudes en compartirlo en las redes sociales. Comparto el código de todo lo avanzado en el video  para que tu mismo puedas probarlo, espero te sea muy útil 8-)

Sigue todas las lecciones del curso AQUÍ.

Saludos!!!

firma emm

 


Descargar código

Por favor comparte esta lección:

¿Te gustó el artículo? ¡Suscríbete ahora mismo!

Recibe mis últimos artículos, recursos, tutoriales y mucho más.

, , ,

Comentarios

  • Hola, gracias por ayudar a la comunidad!

    cuando intento subir una imagen, usando el upload la pagina no guarda el registro sino lanza este error…

    Warning (4096): Argument 1 passed to Hash::get() must be of the type array, string given, called in C:\xampp\htdocs\cakephp\app\Plugin\Upload\Model\Behavior\UploadBehavior.php on line 477 and defined [CORE\Cake\Utility\Hash.php, line 45]

    • Sorry, ya logre solucionarlo, era un fallo de nombre en la validacion, pero aun sigue sin servirme, cuando cargo la imagen y doy submit, no sale ningun error y no envia los datos, justo no hace nada

      • Edson Mollericona Marín

        Hola Logosie me alegra que hayas solucionado tu anterior duda, mira respecto a lo que ahora me mencionas te aconsejo que revises el código que comparto en el artículo y en concreto el modelo Platillo.php porque allí se define el comportamiento del plugin para subir nuestra imagen como en este caso no te genera ningún error quizá solo sea un detalle que se te está yendo. Saludos!!!

  • Pablo

    Edson, buen dia, sabes que me esta pasando ?
    Cuando hago una edicion del registro, no me esta cambiando la imagen
    lleva alguna conf en particular ?

  • Pablo

    PAra aclarar un poco mas si lo pongo asi edita pero no cambia el archivo
    Form->create(‘Equipo’, array(‘action’ => ‘admin_editar’)); ?>
    pero si pongo asi el form no se envia
    Form->create(‘Equipo’, array(‘type’ => ‘file’)); ?>

  • Pablo

    ya funciono, no se porque asi no funciona
    if ($this->request->is(‘post’,’put’))
    {
    pero asi si
    if ($this->request->is(‘put’))
    {

    • Edson Mollericona Marín

      Hola Pablo, revisa bien tu acción dentro del controlador ya que debería dar sin problemas tanto con post como con put, tienes el código en el repositorio del proyecto como apoyo. Saludos!

  • Juandy Ocampo

    Hola sr. Edson, quería preguntar lo sgte: verá cuando dejo el formulario en blanco o cuando lo modificó, me sucede esto:

    Warning (2): strpos() expects parameter 1 to be string, array given [CORE/Cake/basics.php, line 251]

    Warning (2): explode() expects parameter 2 to be string, array given [CORE/Cake/basics.php, line 252]

    Notice (8): Array to string conversion [CORE/Cake/View/View.php, line 1106]

    Notice (8): Array to string conversion [CORE/Cake/View/View.php, line 1106]

    Notice (8): Array to string conversion [CORE/Cake/View/View.php, line 1106]

    Warning (2): strpos() expects parameter 1 to be string, array given [CORE/Cake/basics.php, line 251]

    Warning (2): explode() expects parameter 2 to be string, array given [CORE/Cake/basics.php, line 252]

    Notice (8): Undefined offset: 0 [CORE/Cake/basics.php, line 254]

    Notice (8): Undefined offset: 1 [CORE/Cake/View/View.php, line 422]

    Notice (1024): Element Not Found: .Elements/.ctp [CORE/Cake/View/View.php, line 425]

    traté de ver su código del vídeo, pero me salen todos esos errores y la verdad no me doy cuenta en dónde esta la falla y no sé que hacer.

    Espero su respuesta y gracias de antemano.

    Saludos.

    • Edson Mollericona Marín

      Hola Juandy, verifica la configuración del plugin desde el modelo Platillo, generalmente los problemas radican allí, también verifica la vista del formulario donde se sube la imagen, revisa si estas definiendo correctamente el formulario y los campos para subir la imagen, puedes comparar con el código que comparto en el repositorio del proyecto que lo encuentras al final del artículo. Saludos!

  • Pablo Gay

    Hola Edson, sigo todas tus publicaciones porque son muy claras y completas, te felicito por el gran trabajo que hacés. En esta oportunidad utilizando este plugin, me sale este error: Fatal error: Class ‘Hash’ not found in C:wampwwwsigeduapppluginsUploadModelBehaviorUploadBehavior.php on line 1079. ¿Alguna idea sobre qué puede estar ocurriendome? Gracias y saludos.

    • Edson

      Hola Pablo primeramente gracias a ti por el comentario y por seguir mi trabajo, respecto a tu duda la verdad que nunca me tope con ese tipo de error, dime con que versión de CakePHP estás trabajando. Saludos!

      • Pablo Gay

        Gracias Edson por responder. Estoy trabajando con la versión 2.0.6 ¿Será eso?

        • Edson

          Hola nuevamente Pablo, lo dudo porque según la documentación se puede implementar para cualquier versión para la rama 2.x, revisaste el código del repositorio que comparto? revisa y compáralo con lo que estas haciendo, quizá de esa manera encuentres el error. Saludos!

          • Pablo Gay

            Hola Edson, luego de un impass retomo mi aplicación y sigo tratando de resolver el problema. Comparé el código con tu aplicación y ahora al momento de cargar una imagen me sale el siguiente error: Warning (2): preg_match() expects parameter 2 to be string, array given [CORECakeModelModel.php, line 2985]. ¿Alguna idea? Te envío por correo el detalle.
            Desde ya muchas gracias por compartir tus conocimientos y por responder a nuestras dificultades. Saludazos!

  • Bruno Antinori Gomez

    Hola Edson, Primero felicitarte por toda los vídeos que publicas; aunque no soy programados experto, reciente estoy empezando tus guias me ayudan. me surgió un pequeño problema al mostrar la foto, aunque pongo el código para subir el nivel de la carpeta contenedora no logro subir te adjunto una imagen.

    Saludos.

    • Edson

      Hola Bruno, primeramente gracias por seguir mi trabajo, respecto a tu problema: si ya pudiste subir la imagen y solo el problema es mostrarlo quizá es un detalle de la ruta para encontrar la imagen. Desde la herramienta para desarrolladores verifica si puedes abrir la foto desde la ruta que te genera en la imagen que me muestras, si te da problema con ello revisa bien la ruta que estas generando desde tu código sobre todo si cambiaste los directorios para subir la foto. Saludos!!!

  • Edson

    Hola Mauricio, ese detalle se solucionó durante el curso, acabo de probar la aplicación y funciona tal como debe ser, si al editar no deseas cargar una nueva imagen este mantendrá la imagen que ya tenia cargado anteriormente. Puedes revisar el repositorio oficial del proyecto para que aclares ese detalle. Saludos!!!

  • Edson

    Hola nuevamente Bruno, me alegra que ya lo hayas solucionado, respecto a lo otro la mejor fuente de información siempre será la documentación oficial del framework ademas que siempre se mantiene actualizado. Saludos y gracias por seguir mi trabajo 8-) !!

  • Patricio Divasto

    Hola, buena pagina, muy bien explicado, tengo una consulta estoy aprendiendo cakephp con este curso pero la version uploaad va en la 3.x y requiere cakephp 3.x. me srive? en que parte esta en este proyecto?

  • Roberto Martinez

    Hola,, me interesó mucho este video debido a que quiero enviar archivos por medio de un email y según entiendo primero debo subir el archivo al servidor para poder enviarlo, quisiera preguntar si hay alguna forma de subir los archivos pero que solo se almacenen de manera temporal? y bueno si hay otra forma más óptima de enviar los correos con Cake?
    Por cierto investigue en la documentación de cake para enviar correos pero no acabo de entender como se atachan.
    Saludos y gracias de antemano

    • Edson

      Hola Roberto, puedes utilizar el plugin para subir el archivo que desees pero el mantenerlo temporalmente quizá lo tengas que programar tu de acuerdo al momento en que quieres que se elimine el archivo, respecto al email el mejor camino y el que te aconsejo es que utilices la clase CakeEmail para enviar correos electrónicos de manera muy sencilla y para tu caso puedes usar el método attachments() el cual debes enviar como parámetro el archivo, adicionalmente puedes enviar el mimetype, más información lo puedes encontrar aquí: http://book.cakephp.org/2.0/en/core-utility-libraries/email.html#sending-attachments . Saludos!!!

      • Roberto Martinez

        Hola de nuevo, te comento que estoy intentando subir archivos con tu ejemplo, pero me manda un error y ya estuve buscando y repasando tu artículo y vídeo pero no encuentro el error, te adjunto la imagen de mi error y el código.Disculpa la molestia, soy novato en esto y aun me cuesta trabajo entender algunas cosas. Saludos

        • Edson

          Revisaste el repositorio de la aplicación que desarrollamos durante el curso? quizá es solo un detalle que se te está yendo. Saludos.

          • Roberto Martinez

            Ya pude resolverlo gracias, el problema radicaba en el form del view que no había especificad el type como file. Una última cosa, en el curso comentas que solo lo haces para imágenes pero que se puede configurar para otros archivos, yo hice unas pruebas con la misma configuración pero cargando pdf’s y funciona igual, lo que quiero preguntar es si conoces la forma de especificarle el tamaño máximo de un archivo porque al parecer cuando subo un archivo de más de 2 mb no lo almacena: Gracias de antemano

          • Edson

            Hola Roberto, me alegra que hayas solucionado el problema anterior, respecto a tu otra duda si puedes validar el tamaño del archivo, revisa el apartado de validación del plugin el cual puedes indicarle un tamaño máximo al archivo o tambien puedes hacerlo con las validaciones del propio framework, acá te paso un enlace que te puede servir: http://book.cakephp.org/2.0/en/models/data-validation.html#Validation::fileSize . Perdon por el retraso en responder, lo que pasa es que ando pasando por un fuerte resfrio. Saludos.

  • Edson

    Hola George, gracias por las felicitaciones y me alegra que el contenido que comparto te sea útil. Respecto a tu duda no estoy seguro si podrás hacer lo que indicas ya que al parecer siempre te guarda la imagen original por defecto, de todas formas quizá se mencione algo en la documentación del plugin, la verdad hace tiempo que no lo he revisado. Un saludo cuéntame si encontraste alguna forma para que así otros con la misma duda puedan ser también beneficiados. Un saludo!

  • Angela Patricia Mayor Ortiz

    gracias, Edson este video de tutorial si fue muy interesante, util y completo…

    • Edson

      De nada Angela, espero te haya sido muy útil. Saludos!

  • Jhonatan Flores

    Hola Edson muchísimas gracias, tus vídeos me han servido de mucho te lo agradezco bastante.Ademas quiero consultarte un detalle que e encontrado Al editar el registro me pide la imagen un mensaje en el campo file (La imagen no es jpg ni png) , como corrijo ese error. Espero me des un camino hacia la solución. Saludos gracias

    • Edson

      Hola Jhonatan, te agradezco a ti por valorar mi trabajo. Respecto a tu duda el detalle está en el modelo y en la validación, revisaste el respositorio del proyecto que comparto al final del artículo?

  • Hola. A pesar de que tengo Cake 3.x, este plugin tampoco me funcionó para Cake 2.x para subir varias o multiples imagenes a la vez en un solo campo. Solamente me sube la ultima imagen seleccionada, mi view del form es asi:
    echo $this->Form->input(‘photo[]’, array(‘type’ => ‘file’, ‘multiple’)); me sale el siguiente error: http://pastebin.com/uzAG6KXc

  • Lucas Jose

    Hola, Edson! Antes que nada te agradezco el tiempo que te has tomado para realizar estos tutoriales!!!!
    Tengo una consulta:
    Estoy usando CakePHP 2.5.4
    El plugin lo instale desde GitClone (tal como en tu tutorial). Me asegure que fuese para 2.x y no para 3.x
    A modo de aprendizaje tengo una BD con una sola tabla. Le agregue las columnas ‘foto’ y ‘foto_dir’
    Resumiendo: Siguiendo el tutorial, logré subir fotos en Cake :)
    Pero si bien son warnings y SOLAMENTE ocurre al cargar el primer registro en una BD vacia (al cargar el segundo, tercero, etc…) registro dicho warning que copio y pego abajo ya no sale.

    Warning (2): exif_read_data(vga_calia.jpg): IFD data bad offset: 0xFFFFFD8C length 0x20B0 [APP/Plugin/Upload/Model/Behavior/UploadBehavior.php, line 1509]

    Warning (2): exif_read_data(thumb_calia.jpg) [exif_read_data]: IFD data bad offset: 0xFFFFFD8C length 0x20B0 [APP/Plugin/Upload/Model/Behavior/UploadBehavior.php, line 1509]

    ¿Alguna idea a qué se deben dichos warnings y cómo quitarlos?

    Desde ya, muchas gracias!

    Por cierto: ¿Alguna idea o link en donde pueda aprender a cómo cargar y recuperar varias imágenes de un mismo registro. Por dar un ejemplo: tengo una tabla arboles, y quiero guardar en cada registro, el nombre del árbol, una descripción de el y una secuencia de imágenes de dicho árbol, pero siendo variable para cada registro. Digamos algo así como:
    pino – se usa en navidad – foto_de_pino1, foto_de_ pino2
    roble – bueno para muebles – foto_de_roble1 , foto_de_ roble2 , foto_de_roble3
    algarrobo – bueno para muebles tambien – foto_de_algarrobo1

    No sé si me explico.
    Nuevamente gracias!

    • Edson

      Hola Lucas, me alegra que te haya sido útil el tutorial, respecto a tu consulta me parece que es algo referente al formato del archivo que estás subiendo, revisa bien si estás validando o configurando correctamente el plugin, puedes apoyarte del código que comparto al final de la lección. Respecto a lo segundo lo que entiendo es que quieres subir multiples archivos, segun ví la documentación del plugin hay una opción para hacerlo pero la verdad que no lo he probado para garantizarte el correcto funcionamiento, sería cuestión de que leas la documentación del plugin para implementarlo. Saludos y gracias por seguir mi trabajo.

      • Lucas Jose

        Gracias por tu respuesta!
        Vamos a lo primero: el plugin Upload para subir UNA imagen anda excelente (gracias a tu tutorial). El warning que me salía al intentar agragar dicha imagen luego de probar, si agregaba otra imágen como primera y la problematica como segunda, el warning salia en la carga de la segunda. O sea que no tenia que ver con ser la carga de la primera imagen… no tengo idea pues no salta ninguna regla de validación, pero solamente es con dicha imagen en particular (de extensión .jpg). Sacandola del conjunto de imagenes a subir para probar el ejemplo todo anduvo bien. ¿Derechos de copyright, alguna cosa asi? En fin, a ello no le doy mas vueltas.

        respecto a la carga de multiples imagenes, sí, me entendiste bien. Desde que lei tu respuesta que estoy probando con lo dicho en la documentacion para lograr lo que deseo, ya sea con “Uploading Multiple files” o con “Using a polymorphic attachment model for file storage” y nada :( no doy con la solución….

        • Edson

          Hola Lucas, respecto a subir multiples archivos por qué entonces no te crear un método para subir un archivo y lo vas iterando segun la cantidad de archivos que vayas a procesar para subir, si bien ya te funciona la subida de un solo archivo puedes intentar lo que te dije, lo único que debes tener en cuenta es que en lo posible trates de restringir una cantidad máxima de archivos a subir ya que si colocas muchos archivos puede verse afectado el rendimiento de tu aplicación. Saludos.

          • Lucas Jose

            Antes que nada te agradezco el tiempo que te tomas para comentarme. Muy amable de tu parte!
            Lo pude solucionar de una manera “burda”. Mas abajo explico el porque la llamo asi.
            Para empezar lo dividí en dos tablas y le agregue un campo mas. En definitiva:

            *Tabla arboles:
            id : int(11)
            codigo : int(100)
            nombre : varchar(255)
            descripción : varchar(255)

            *Tabla fotos:
            id : int(11)
            codigo : int(100)
            foto: varchar(255)
            foto_dir : varchar(255)

            Siguiendo tu clase 11 cargar una foto con su respectivo codigo anda de maravilla.

            Por las convenciones de CakePHP el campo id siempre es la clave. Pero ésto no me sirve, deseo una clave que yo pueda entrar. Dicha “fingida” clave es el campo codigo.
            En un bosquejo en general (que sé que deberé arreglar), el valor que identifica al arbol en su campo codigo es igual al valor que debo introducir en el campo codigo de fotos.
            Haciendo un join a traves de una consulta SQL en el controlador de arboles y al pasarselo a la vista de éste, logro lo deseado.
            Burdo: ¡Pues no defino ninguna relación! Veo que un Arbol hasMany Foto…
            Al no hacer dicha relación me limita a no poder acceder a toda la “magia” de CakePHP… por ejemplo no poder recorrer los modelos al no estar relacionados. (curso 6, por donde voy y de nuevo te felicito por la dedicación y explicaciones excelentemente pedagógicas que das).

            No sé como hacer para definir la relación hasMany entre Arbol y Foto pero que la clave (o llave) en Arbol no sea el campo id, sino el campo codigo, como a su vez romper la convención de que en la tabla fotos la clave foránea en lugar de que sea arbol_id, sea el campo codigo de dicha tabla.

            No se si me expliqué bien.

            Muchas gracias por TODO el aporte que me brindas tanto a mí como al resto de la comunidad!

          • Edson

            Hola Lucas, lo correcto me parece es que crees dicha relación entre árbol y fotos (un árbol tiene muchas fotos) y haces bien en tener un campo código pero ahora solo sería necesario el código en la tabla árbol ya que como estará relacionado con fotos entonces este tendrá su llave foránea (arbol_id) entonces cada vez que guardes una o mas fotos estos estarán asociados con ese identificador de árbol y por ende con el código creado del árbol en concreto, así lo solucionas y seguir gozando de las facultades del framework. Saludos y espero se haya entendido.