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