Skip to content

Dateispeicher

Das Dateispeichersystem von Doggy basiert auf League Flysystem und unterstützt lokalen Speicher sowie S3-kompatiblen Speicher. Es bietet Datei-Upload, Bildoptimierung und URL-Generierung.

Übersicht

Das Speichersystem befindet sich unter src/Service/Storage/:

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

Die zugehörigen Entitäten befinden sich unter src/Entity/Storage/:

EntitätBeschreibung
File.phpDateidatensatz
StorageConfig.phpSpeicherkonfiguration (Adaptertyp, Parameter, CDN-Domain)
UploadSession.phpUpload-Sitzung

Storage-Backends

BackendAdapterEinsatzszenario
LocalLocalStorageAdapterEntwicklungsumgebung, kleine Bereitstellungen
AWS S3S3StorageAdapterCloud-Bereitstellung (unterstützt CDN-Domain)

Lokaler Speicher

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

S3-Speicher

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',
]);

Datei-Upload

FileUploadService bietet einen vollständigen Upload-Ablauf:

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

Upload-Ablauf:

  1. FileUploadingEvent auslösen (kann die Optionen abfangen und ändern)
  2. Dateisicherheitsprüfung (Typ, Größe, Dateiendung, MIME)
  3. SHA-256-Hash-Deduplizierung
  4. Speicherpfad nach Datumsstrategie generieren (Y/m/uuid.ext oder uuid.ext)
  5. Zum Adapter hochladen
  6. File-Entität erstellen
  7. FileUploadedEvent auslösen
  8. Asynchrone Bildkomprimierungsnachricht (ImageCompressMessage)

Bildoptimierung

ImageOptimizerService basiert auf der Imagine-Bibliothek:

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

URL-Generierung

FileUrlGenerator unterstützt Caching und temporäre URLs:

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

Verwaltungsoberfläche

Einstieg: App\Controller\Admin\StorageConfigController

Template: templates/admin/storage/

Open Source unter MIT | Copyright © 2026 Doggy