Skip to content

Stockage de fichiers

Le système de stockage de fichiers de Doggy est construit sur League Flysystem, avec prise en charge du stockage local et du stockage compatible S3, et fournit le téléversement de fichiers, l'optimisation d'images, la génération d'URL, etc.

Aperçu

Le système de stockage se trouve dans src/Service/Storage/ :

src/Service/Storage/
├── StorageManager.php          # 存储管理器(适配器选择)
├── FileUploadService.php       # 文件上传服务
├── FileUrlGenerator.php        # URL 生成/缓存
├── ImageOptimizerService.php   # 图片优化(Imagine 库)
└── Adapter/
    ├── StorageAdapterInterface.php
    ├── LocalStorageAdapter.php
    └── S3StorageAdapter.php

Les entités associées se trouvent dans src/Entity/Storage/ :

EntitéDescription
File.phpEnregistrement de fichier
StorageConfig.phpConfiguration de stockage (type d'adaptateur, paramètres, domaine CDN)
UploadSession.phpSession de téléversement

Backends de stockage

BackendAdaptateurCas d'usage
LocalLocalStorageAdapterEnvironnement de développement, déploiements à petite échelle
AWS S3S3StorageAdapterDéploiement cloud (prise en charge du domaine CDN)

Stockage local

php
// 默认本地存储:public/uploads/
$adapter = new LocalStorageAdapter(
    rootPath: '/var/www/public/uploads',
    publicUrl: '/uploads'
);

Stockage S3

php
// S3 兼容存储(支持 AWS、MinIO、阿里云 OSS 等)
$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',
]);

Téléversement de fichiers

FileUploadService fournit un flux de téléversement complet :

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

Flux de téléversement :

  1. Déclenchement de l'événement FileUploadingEvent (interceptable pour modifier les options)
  2. Contrôle de sécurité du fichier (type, taille, extension, MIME)
  3. Déduplication via le hachage SHA-256
  4. Génération du chemin de stockage selon une stratégie basée sur la date (Y/m/uuid.ext ou uuid.ext)
  5. Téléversement vers l'adaptateur
  6. Création de l'entité File
  7. Déclenchement de l'événement FileUploadedEvent
  8. Message asynchrone de compression d'image (ImageCompressMessage)

Optimisation d'images

ImageOptimizerService est basé sur la bibliothèque Imagine :

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

Génération d'URL

FileUrlGenerator prend en charge le cache et les URL temporaires :

php
$url = $urlGenerator->getUrl($file);                          // 带缓存
$tempUrl = $urlGenerator->getTemporaryUrl($file, $expiresAt); // 签名 URL
$urlGenerator->invalidateUrl($file);                          // 清除缓存

Interface d'administration

Point d'entrée : App\Controller\Admin\StorageConfigController

Modèles : templates/admin/storage/

Open source sous licence MIT | Copyright © 2026 Doggy