Skip to content

Almacenamiento de archivos

El sistema de almacenamiento de archivos de Doggy está construido sobre League Flysystem y admite almacenamiento local y compatible con S3, ofreciendo capacidades como subida de archivos, optimización de imágenes y generación de URLs.

Descripción general

El sistema de almacenamiento se encuentra en src/Service/Storage/:

src/Service/Storage/
├── StorageManager.php          # Gestor de almacenamiento (selección de adaptador)
├── FileUploadService.php       # Servicio de subida de archivos
├── FileUrlGenerator.php        # Generación de URLs / caché
├── ImageOptimizerService.php   # Optimización de imágenes (librería Imagine)
└── Adapter/
    ├── StorageAdapterInterface.php
    ├── LocalStorageAdapter.php
    └── S3StorageAdapter.php

Las entidades relacionadas están en src/Entity/Storage/:

EntidadDescripción
File.phpRegistro de archivos
StorageConfig.phpConfiguración de almacenamiento (tipo de adaptador, parámetros, dominio CDN)
UploadSession.phpSesión de subida

Backends de almacenamiento

BackendAdaptadorEscenario de uso
LocalLocalStorageAdapterEntorno de desarrollo, despliegues de pequeña escala
AWS S3S3StorageAdapterDespliegue en la nube (soporta dominio CDN)

Almacenamiento local

php
// Almacenamiento local por defecto: public/uploads/
$adapter = new LocalStorageAdapter(
    rootPath: '/var/www/public/uploads',
    publicUrl: '/uploads'
);

Almacenamiento S3

php
// Almacenamiento compatible con S3 (soporta AWS, MinIO, Alibaba Cloud OSS, etc.)
$adapter = new S3StorageAdapter([
    'access_key' => '...',
    'secret_key' => '...',
    'region' => 'us-east-1',
    'bucket' => 'doggy-files',
    'endpoint' => 'https://oss-cn-hangzhou.aliyuncs.com',
    'cdn_domain' => 'https://cdn.example.com',
]);

Subida de archivos

FileUploadService ofrece el flujo completo de subida:

php
$file = $fileUploadService->upload($uploadedFile, [
    'disk' => 'default',
    'optimize' => true,
    'max_size' => 52428800,  // 50MB
]);

Flujo de subida:

  1. Se lanza el evento FileUploadingEvent (permite interceptar y modificar opciones)
  2. Comprobación de seguridad del archivo (tipo, tamaño, extensión, MIME)
  3. Deduplicación mediante hash SHA-256
  4. Generación de la ruta de almacenamiento según una estrategia por fecha (Y/m/uuid.ext o uuid.ext)
  5. Subida al adaptador
  6. Creación de la entidad File
  7. Se lanza el evento FileUploadedEvent
  8. Mensaje asíncrono de compresión de imagen (ImageCompressMessage)

Optimización de imágenes

ImageOptimizerService se basa en la librería Imagine:

php
$optimizer->optimize($sourcePath, $targetPath, [
    'max_width' => 1920,
    'max_height' => 1080,
    'quality' => 80,
    'format' => 'webp',
]);

Generación de URLs

FileUrlGenerator admite caché y URLs temporales:

php
$url = $urlGenerator->getUrl($file);                          // con caché
$tempUrl = $urlGenerator->getTemporaryUrl($file, $expiresAt); // URL firmada
$urlGenerator->invalidateUrl($file);                          // limpiar caché

Interfaz de administración

Entrada: App\Controller\Admin\StorageConfigController

Plantilla: templates/admin/storage/

Código abierto bajo MIT | Copyright © 2026 Doggy