laravel

Laravel: subir archivos y aplicar validación

En este post voy a mostrarte cómo enviar o subir fotos con un formulario, y procesarlas para almacenarlas con Laravel.

También te voy a enseñar cómo validar las fotos, para permitir determinadas extensiones o peso.

Será un formulario que aceptará la subida de múltiples imágenes, las validará y almacenará.

Aunque es para imágenes, este ejemplo también serviría para subir otro tipo de archivos.

El formulario

El formulario de la subida de imágenes queda como se ve a continuación. Es importante definir el enctype en multipart/form-data y poner la directiva @csrf para el token CSRF (más información aquí)

Abajo del formulario estamos incluyendo un componente de errores, que simplemente muestra la lista de errores de validación.

See the gist on github.

Para que se puedan subir varias imágenes, se coloca el atributo multiple en el input. En el accept se muestran las extensiones que permitirá (aunque esta es una validación del lado del cliente, no confíes)

El name es muy importante, sobre todo con los corchetes del final. Puedes nombrarlo como quieras, pero agrega los [] al final.

Finalmente, el action del formulario es en la ruta agregarFotosDeArticulo que simplemente redirige al controlador:

Route::post("articulos/fotos","ArticulosController@agregarFotos")->name("agregarFotosDeArticulo");

Lista de errores

El componente que muestra los errores es el siguiente. Tiene algunas clases y estilos, pero eso no debe importar:

See the gist on github.

Si la validación falla, los errores van a ser mostrados aquí.

El FormRequest

Vamos a validar la petición, y para hacerla bien, vamos a crear un Request personalizado, que simplemente va a validar las imágenes.

Por favor mira más sobre las validaciones en este post, ya que aquí lo voy a resumir.

Vamos a crear el archivo app/Http/Requests/SubirFotosDeArticulosRequest.php con el siguiente contenido:

See the gist on github.

Fíjate en el método rules, estamos regresando un arreglo que dice, en lenguaje humano:

  • El campo fotos (aunque en el formulario se llama fotos[]) es requerido y debe ser un arreglo.
  • Cualquier elemento de fotos:
    • Es requerido
    • Debe ser una imagen
    • Su mime type debe ser jpeg o png
    • Puede pesar hasta 3000 kilobytes

Si esta validación falla, se le mostrará al usuario en el formulario en el componente de errores, además de que el método del controlador no será llamado.

El controlador

Si la validación es correcta, se llamará al controlador en donde vamos a procesar los archivos subidos.

El método que se invoca es agregarFotos, y recibe como argumento el FormRequest que creamos anteriormente.

Para acceder a las fotos accedemos a $peticion->file("fotos") en un foreach.

See the gist on github.

 

Para guardar la foto en el disco duro, invocamos al método llamado store indicando el nombre de la carpeta en donde se va a almacenar.

Ese método va a devolver la ruta de la imagen recién guardada.

Opcionalmente se podrían guardar los datos de la imagen en la base de datos a través de un modelo, esto es totalmente opcional, pero si quieres llevar un registro de las fotos que se suben, deberías hacerlo.

Al final hacemos un return back() para mostrar un mensaje de retroalimentación en el formulario, y ya quedó.

Demostración de subida de imágenes con Laravel

Vamos a mostrar lo aprendido aquí. Cuando los datos se envían y son correctos, se muestra un mensaje de éxito y los archivos son almacenados:

Subir archivos con Laravel – Validación pasada

En cambio, cuando la validación falla, ya sea porque una imagen es pesada o porque algo no es una imagen, se muestran los errores:

Subir archivos con Laravel – Errores de validación

De esta manera podemos validar no solo fotos, sino cualquier otro tipo de archivos.

Recuerda que todas las validaciones están en la documentación oficial.

Nota sobre los campos opcionales

Si quieres que las fotos o archivos sean opcionales, pero quieres validarlos en caso de que estén presentes, haz algo como lo siguiente:

See the gist on github.

Nota: mi campo en el formulario se llama fotos[].

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Imprimir PDF con Bot de Telegram

La impresión de un PDF en cualquier impresora se puede automatizar con un bot de…

2 días hace

Enviar mensaje con bot de Telegram usando JavaScript (lado del cliente)

Hoy te enseñaré cómo enviar un mensaje a un usuario desde un bot de Telegram…

2 días hace

PHP: incrustar imagen en base64

El día de hoy te enseñaré algo muy sencillo pero útil al programar con PHP:…

3 días hace

Plugin ESC POS – Actualización 3.4.0: imprimir HTML

El plugin para imprimir en impresoras térmicas alcanza hoy su versión 3.4.0 agregando soporte para…

4 días hace

JavaScript (lado del cliente): leer pixeles de imagen

En ocasiones es necesario leer los pixeles y colores de una imagen con JavaScript del…

1 semana hace

PHP y JavaScript: llenar select con AJAX

Siguiendo con los tutoriales de listas desplegables o select con JavaScript, vamos a ver cómo…

2 semanas hace

Esta web usa cookies.