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