Skip to main content

¿Qué es el almacenamiento de archivos?

Laravel ofrece una potente capa de abstracción del sistema de archivos basada en el paquete PHP Flysystem. Puedes manipular con la misma API distintos backends de almacenamiento (disco local, SFTP, Amazon S3…), por lo que no necesitas cambiar el código al pasar de uno a otro según el entorno.
Al cambiar de driver, el código no cambia. Puedes usar el disco local en desarrollo y S3 en producción con configuración muy simple.

Configuración

La configuración del sistema de archivos se centraliza en config/filesystems.php. Ahí defines los “discos”. Un disco es la combinación de un driver y una ubicación de almacenamiento. Los drivers principales son:

Driver local

Con el driver local, las operaciones se realizan tomando como base la ruta root de la configuración filesystems. Por defecto, root es storage/app/private.

Cambiar el disco por defecto

Cambia el disco por defecto con la variable FILESYSTEM_DISK.

Disco public y enlaces simbólicos

El disco public sirve para almacenar archivos accesibles desde la web. Por defecto se guardan en el directorio storage/app/public. Para que sean accesibles desde el servidor web, crea un enlace simbólico de public/storage a storage/app/public.
1

Crear el enlace simbólico

2

Obtener la URL del archivo

Tras crear el enlace, puedes generar la URL con el helper asset.
Si necesitas enlaces simbólicos adicionales, configúralos en el array links de config/filesystems.php.
Para eliminar el enlace simbólico usa storage:unlink.

Operaciones básicas con la fachada Storage

Leer archivos

Escribir archivos

Si put falla devuelve false por defecto. Con 'throw' => true en la configuración del disco puedes hacer que lance excepciones.

Eliminar archivos

Respuesta de descarga

Generación de URLs

URL normal

Con el driver local devuelve una URL relativa como /storage/file.jpg. Con s3 devuelve la URL remota completa.

URLs temporales

Para generar URLs con caducidad usa temporaryUrl. Disponible en los drivers local y s3.
En S3 puedes indicar parámetros adicionales.
Si necesitas una URL temporal para subir, usa temporaryUploadUrl. Es útil en configuraciones serverless en las que el cliente sube directamente a S3.

Subida de archivos

Patrón habitual para guardar un archivo enviado por un formulario.

store (genera nombre automáticamente)

storeAs (nombre explícito)

Subir a un disco concreto

Subir con la fachada Storage

getClientOriginalName() y getClientOriginalExtension() no son seguros porque el usuario puede manipularlos. Para el nombre usa hashName() y para la extensión extension().

Visibilidad de los archivos

En Flysystem, la privacidad se gestiona con visibility.
Para guardar un archivo subido como público, usa storePublicly.

Uso de varios discos

Cambia de disco con disk.

Configuración del almacenamiento en la nube (S3)

Instalación del paquete

Variables de entorno

Configura las credenciales de S3 en .env.
Servicios compatibles con S3 como DigitalOcean Spaces, Cloudflare R2 o Vultr Object Storage también funcionan con el driver s3. Indica su endpoint en la opción endpoint.

Metadatos del archivo

Operaciones con directorios

Pruebas

Con Storage::fake() puedes probar operaciones de archivo sin tocar el disco real.
Para usar UploadedFile::fake()->image() necesitas la extensión GD de PHP.

Caso práctico: subida de una imagen de perfil

Ejemplo de un controlador que combina validación, guardado y registro de la ruta en la BD.
En la plantilla usa Storage::url() para obtener la URL.
Última modificación el 13 de julio de 2026