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.phpLes entités associées se trouvent dans src/Entity/Storage/ :
| Entité | Description |
|---|---|
File.php | Enregistrement de fichier |
StorageConfig.php | Configuration de stockage (type d'adaptateur, paramètres, domaine CDN) |
UploadSession.php | Session de téléversement |
Backends de stockage
| Backend | Adaptateur | Cas d'usage |
|---|---|---|
| Local | LocalStorageAdapter | Environnement de développement, déploiements à petite échelle |
| AWS S3 | S3StorageAdapter | Dé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 :
- Déclenchement de l'événement
FileUploadingEvent(interceptable pour modifier les options) - Contrôle de sécurité du fichier (type, taille, extension, MIME)
- Déduplication via le hachage SHA-256
- Génération du chemin de stockage selon une stratégie basée sur la date (
Y/m/uuid.extouuuid.ext) - Téléversement vers l'adaptateur
- Création de l'entité File
- Déclenchement de l'événement
FileUploadedEvent - 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/