Carga de imágenes o archivos en Laravel

Video thumbnail

Ya dominamos a Artisan, la línea de comandos de Laravel, el siguiente paso consiste en subir o cargar archivos en Laravel; que es una de las tareas más comunes en cualquier aplicación web: imágenes, documentos, PDF, etc. Laravel lo hace especialmente fácil gracias a su sistema de almacenamiento en discos, que puede ser local o en la nube.

En esta guía te explico cómo hacerlo paso a paso, con ejemplos reales y recomendaciones basadas en mi propia experiencia trabajando con Laravel.

⚙️ Requisitos previos y configuración inicial

Antes de empezar, asegúrate de tener un proyecto Laravel funcional y un formulario básico. Si aún no tienes uno, puedes crear tu entorno con:

$ laravel new upload-demo
$ cd upload-demo
$ php artisan serve

Laravel usa un sistema de “discos” configurados en el archivo config/filesystems.php.

Por defecto encontrarás tres:

  • local: guarda los archivos en storage/app
  • public: accesible desde el navegador (vinculado con public/storage)
  • s3: para cargas en Amazon Web Services

Para hacer accesible el disco público, ejecuta:

$ php artisan storage:link

Esto crea un enlace simbólico entre storage/app/public y public/storage, permitiendo mostrar archivos subidos desde el navegador; esto SOLO si no quieres subir los archivos en la carpeta public, si no o no estas seguro, no hace falta que ejecutes el comando anterior.

Creación del formulario para subir archivos

Lo importante de notar aquí, es el campo de tipo multipart form data para habilitar la carga de archivos, y el campo de tipo file.

Para procesar el formulario, tenemos lo siguiente:

<form action="{{ route('post.update', $post->id) }}" method="POST" enctype="multipart/form-data">
    @method('PATCH')
    @csrf

    <label for="">Título</label>
    <input type="text" name="title" value="{{ old('title', $post->title) }}">

    <label for="">Imagen</label>
    <input type="file" name="image">

    <button type="submit" class="btn btn-success mt-3">Enviar</button>
</form>

Tip: si planeas subir múltiples archivos, usa multiple en el input y procesa un array de archivos en el controlador.

Validación y procesamiento en el controlador

En este caso, vamos a trabajar con carga de imágenes a un post, que tiene la siguiente estructura, su modelo:

class Post extends Model
{
    protected $fillable = ['title', 'slug', 'content', 'category_id', 'description', 'posted', 'image'];

    public function category()
    {
        return $this->belongsTo(Category::class);
    }
}

Y la función para procesar el formulario:

public function update(PutRequest $request, Post $post)
    {
       // Resto de la funcion de carga 
        $data = $request->validated();
        if( isset($data["image"])){
            $data["image"] = $filename = time().".".$data["image"]->extension();
            $request->image->move(public_path("image/otro"), $filename);
        }
        $post->update($data);
}

Es muy sencillo; recuerda que la carga de archivos en Laravel está basado en disco, un disco es cualquier cosa que pueda almacenar archivos, como en este caso sería una carpeta local al proyecto, pero, puede ser otro servicio como Amazon Web Server; esto, lo puedes constatar en el archivo de config/filesystem.php.

Por lo demás, ya que, la imagen, lo tenemos como una carga opcional, preguntamos si está definido; generamos el nombre de la imagen con la función de time() y lo guardamos en un "disco", que es nuestra carpeta local.

Y listo, ya con esto, podemos cargar nuestros archivos en Laravel.

Recuerda que este post forma pate de mi curso y libro sobre Laravel.

Guardar archivos en el disco local o en Storage

Laravel abstrae el manejo de archivos mediante el facade Storage. Esto te permite cambiar de ubicación (local, S3, FTP) sin tocar el código base.

Ejemplo con Storage:

use Illuminate\Support\Facades\Storage;
Storage::put('archivos/demo.txt', 'Contenido de ejemplo');

Para obtener la URL pública:

$url = Storage::url('archivos/demo.txt');

Puedes definir discos personalizados en config/filesystems.php, por ejemplo:

'uploads' => [
   'driver' => 'local',
   'root' => public_path('uploads'),
],

️ Mostrar y acceder a los archivos cargados

Si guardaste las imágenes en el disco público, puedes mostrarlas directamente:

<img src="{{ asset('storage/'.$post->image) }}" alt="Imagen del post">

O si usas el método move() hacia public_path(), ajusta la ruta:

<img src="{{ asset('image/otro/'.$post->image) }}" alt="Imagen del post">

Esta segunda opción es más directa cuando trabajas con carpetas locales, pero usar Storage es más flexible si planeas escalar o usar servicios en la nube.

⚠️ Errores comunes y buenas prácticas

Error común    Solución recomendada
No incluir enctype="multipart/form-data"    Asegúrate de agregarlo en el formulario.
Permisos denegados al guardar archivos    Verifica permisos de la carpeta /storage y ejecuta php artisan storage:link.
Sobrescritura de archivos    Usa nombres únicos (por ejemplo, time() o UUID).
Archivos demasiado grandes    Configura upload_max_filesize y post_max_size en php.ini.

Otras buenas prácticas:

  • Valida siempre tipo y tamaño del archivo.
  • Usa Storage en lugar de rutas absolutas para mayor portabilidad.
  • Evita almacenar archivos directamente en la raíz pública si planeas manejar datos sensibles.

Conclusión

Cargar archivos en Laravel es simple pero poderoso. Con solo un formulario, una validación y un método de guardado puedes subir imágenes o documentos a tu aplicación.
En mi caso, la estrategia de generar nombres únicos y usar carpetas dedicadas me ha ahorrado muchos dolores de cabeza.

Y si buscas mayor flexibilidad, Storage te permite migrar tus cargas locales a la nube sin modificar el código de tu aplicación.

❓Preguntas frecuentes

¿Dónde se guardan los archivos en Laravel?
Por defecto, en storage/app, o en storage/app/public si usas el disco público.

¿Cómo valido que el archivo sea una imagen?
Usa la regla image o mimes:jpg,png,jpeg,gif en la validación.

¿Cómo puedo subir archivos a Amazon S3?
Configura el disco s3 en .env con tus credenciales y usa Storage::disk('s3')->put().

Ahora, vas a querer aprender a poder descargar archivos en Laravel lo cual puede ser crucial en tu proyecto, dependiendo de la temática.

Vamos a aprender a realizar la carga de imágenes o cualquier otro archivo en Laravel; desde el manejo del formulario, pasando por las validaciones y llegando al controlador.

Acepto recibir anuncios de interes sobre este Blog.

Andrés Cruz

EN In english