Skip to content

تخزين الملفات ​

يعتمد نظام تخزين الملفات في Doggy على League Flysystem، ويدعم التخزين المحلي والتخزين المتوافق مع S3، مع قدرات رفع الملفات وتحسين الصور وتوليد عناوين URL.

نظرة عامة ​

يقع نظام التخزين في src/Service/Storage/:

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

الكيانات ذات الصلة في src/Entity/Storage/:

الكيانالوصف
File.phpسجل الملف
StorageConfig.phpتكوين التخزين (نوع المحوّل، المعاملات، نطاق CDN)
UploadSession.phpجلسة الرفع

الخلفيات الطرفية للتخزين ​

الخلفيةالمحوّلسيناريو الاستخدام
LocalLocalStorageAdapterبيئة التطوير، النشر صغير الحجم
AWS S3S3StorageAdapterالنشر السحابي (دعم نطاقات CDN)

التخزين المحلي ​

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

تخزين 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',
]);

رفع الملفات ​

يوفر FileUploadService مسار رفع كامل:

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

مسار الرفع:

  1. بث حدث FileUploadingEvent (يمكن اعتراض الخيارات وتعديلها)
  2. فحص أمان الملف (النوع، الحجم، الامتداد، MIME)
  3. إزالة التكرار عبر SHA-256
  4. توليد مسار التخزين وفق سياسة التاريخ (Y/m/uuid.ext أو uuid.ext)
  5. الرفع إلى المحوّل
  6. إنشاء كيان File
  7. بث حدث FileUploadedEvent
  8. رسالة ضغط الصور غير المتزامنة (ImageCompressMessage)

تحسين الصور ​

يعتمد ImageOptimizerService على مكتبة Imagine:

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

توليد عناوين URL ​

يدعم FileUrlGenerator التخزين المؤقت والعناوين المؤقتة:

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

واجهة الإدارة ​

نقطة الدخول: App\Controller\Admin\StorageConfigController

القالب: templates/admin/storage/

مصدر مفتوح برخصة MIT | حقوق النشر © 2026 Doggy