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