Skip to content

إدارة الوسائط

يتضمن FORGE نظام رفع ملفات متعدد الأشكال يتيح لأي نموذج في تطبيقك امتلاك ملفات وصور مرتبطة. يدعم النظام التخزين المحلي وS3 وتوليد متغيرات الصور تلقائياً وواجهة رفع بالسحب والإفلات في لوحة الإدارة.

نظرة عامة

يتبع نظام الوسائط نمط الارتباط متعدد الأشكال على طريقة Spatie. بدلاً من إضافة أعمدة ملفات لكل جدول، يتم تخزين جميع الرفوعات في جدول media مركزي وربطها بالنموذج الأب عبر أعمدة model_type و model_id. يتيح حقل collection مجموعات ملفات متعددة مميزة لكل نموذج (على سبيل المثال، صورة "مميزة" ومجموعة "معرض").

مخطط قاعدة البيانات

يخزن جدول media جميع الملفات المرفوعة:

العمودالنوعالوصف
idUUIDالمفتاح الأساسي
diskVARCHAR(20)واجهة التخزين: local أو s3
pathVARCHAR(500)مسار الملف النسبي ضمن قرص التخزين
filenameVARCHAR(255)اسم الملف الأصلي
mime_typeVARCHAR(100)نوع MIME (مثل image/jpeg، application/pdf)
sizeBIGINTحجم الملف بالبايت
widthINTEGERعرض الصورة بالبكسل (nullable لغير الصور)
heightINTEGERارتفاع الصورة بالبكسل (nullable لغير الصور)
variantsJSONBمتغيرات الصور المُولّدة (صور مصغرة، نسخ مُعاد حجمها)
alt_textVARCHAR(255)النص البديل لإمكانية الوصول
captionVARCHAR(500)تعليق أو وصف اختياري
metadataJSONBبيانات وصفية إضافية للملف
model_typeVARCHAR(100)نوع النموذج الأب (مثل content، user)
model_idUUIDالمفتاح الأساسي للنموذج الأب
collectionVARCHAR(100)مجموعة مُسماة (مثل featured، gallery، avatar)
created_atTIMESTAMPطابع زمني لإنشاء السجل
updated_atTIMESTAMPطابع زمني لآخر تحديث

الارتباط متعدد الأشكال

يتم ربط الملفات بأي نموذج باستخدام مزيج من model_type و model_id و collection:

┌──────────────┐       ┌───────────────────────────────────────┐
│   contents   │       │               media                   │
│──────────────│       │───────────────────────────────────────│
│ id: uuid-1   │◄──────│ model_type: "content"                 │
│ title: About │       │ model_id:   "uuid-1"                  │
│              │       │ collection: "featured"                 │
└──────────────┘       │ filename:   "hero.jpg"                 │
                       └───────────────────────────────────────┘

┌──────────────┐       ┌───────────────────────────────────────┐
│    users     │       │               media                   │
│──────────────│       │───────────────────────────────────────│
│ id: uuid-2   │◄──────│ model_type: "user"                    │
│ name: Jane   │       │ model_id:   "uuid-2"                  │
│              │       │ collection: "avatar"                   │
└──────────────┘       │ filename:   "profile.png"              │
                       └───────────────────────────────────────┘

بنية كائن المتغيرات

يتم توليد متغيرات الصور عند الرفع وتُخزّن كـ JSONB:

json
{
  "thumbnail": {
    "path": "media/content/uuid-1/thumb_hero.jpg",
    "width": 150,
    "height": 150
  },
  "medium": {
    "path": "media/content/uuid-1/med_hero.jpg",
    "width": 600,
    "height": 400
  },
  "large": {
    "path": "media/content/uuid-1/lg_hero.jpg",
    "width": 1200,
    "height": 800
  }
}

واجهة MediaService API

توفر MediaService دوال لإدارة ارتباطات الملفات:

attach()

رفع وربط ملف بنموذج:

rust
let media = media_service.attach(
    file,          // uploaded file data
    "content",     // model_type
    content.id,    // model_id
    "featured"     // collection name
).await?;

detach()

إزالة ارتباط ملف وحذف الملف من التخزين:

rust
media_service.detach(media_id).await?;

get_for_model()

استرجاع جميع ملفات الوسائط لنموذج ومجموعة محددة:

rust
let images = media_service.get_for_model(
    "content",     // model_type
    content.id,    // model_id
    "gallery"      // collection name
).await?;

get_first_for_model()

استرجاع أول (أو الوحيد) ملف وسائط لنموذج ومجموعة:

rust
let avatar = media_service.get_first_for_model(
    "user",        // model_type
    user.id,       // model_id
    "avatar"       // collection name
).await?;

مزودو التخزين

يدعم نظام الوسائط واجهتي تخزين:

المزودالوصف
localتخزين الملفات على نظام الملفات المحلي
s3تخزين الملفات في Amazon S3 أو تخزين متوافق

تتم إدارة إعدادات التخزين من خلال نظام مزودي التخزين. راجع ذلك القسم لتعليمات الإعداد المفصلة.

نصيحة

يمكنك المزج بين مزودي التخزين عبر المجموعات. على سبيل المثال، تخزين صور المستخدمين الشخصية محلياً للوصول السريع وصور المعرض الكبيرة على S3.

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

توفر لوحة الإدارة تجربة إدارة وسائط غنية من خلال صفحة مدير الوسائط المخصصة على /media.

صفحة مدير الوسائط

يوفر مدير الوسائط واجهة مركزية لرفع وإدارة ملفات الوسائط المستقلة (الملفات غير المرتبطة بأي نموذج محدد):

┌─────────────────────────────────────────────────────────┐
│                    مدير الوسائط                          │
├─────────────────────────────────────────────────────────┤
│  ┌───────────────────────────────────────────────────┐  │
│  │         منطقة الرفع (سحب وإفلات)                  │  │
│  │  [أيقونة] انقر للرفع أو اسحب الملفات هنا          │  │
│  │         يدعم ملفات متعددة                         │  │
│  └───────────────────────────────────────────────────┘  │
│                                                         │
│  ┌───────────────────────────────────────────────────┐  │
│  │                  جدول البيانات                     │  │
│  │  [ ] │ معاينة │ اسم الملف │ النوع │ الحجم │ إجراءات│  │
│  │  [ ] │ [صورة] │ logo.png  │ صورة  │156KB │ [...]  │  │
│  │  [ ] │ [أيقونة]│ doc.pdf  │ PDF   │2.4MB │ [...]  │  │
│  │  [ ] │ [أيقونة]│ data.csv │ ملف   │ 89KB │ [...]  │  │
│  └───────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────┘

الميزات

الميزةالوصف
الرفع بالسحب والإفلاتإسقاط الملفات مباشرة على منطقة الرفع للرفع الفوري
رفع ملفات متعددةاختيار أو إسقاط عدة ملفات دفعة واحدة
صور مصغرة للمعاينةمعاينة الصور مباشرة في الجدول
أيقونات أنواع الملفاتأيقونات مرئية لملفات PDF والمستندات والفيديو وأنواع الملفات الأخرى
نسخ الرابطنقرة واحدة لنسخ رابط الملف الكامل للحافظة
فتح في تبويب جديدرابط سريع لعرض الملف في تبويب متصفح جديد
البحث والفلترةفلترة الملفات حسب اسم الملف أو النوع أو المجموعة
أعمدة قابلة للترتيبترتيب حسب اسم الملف أو الحجم أو تاريخ الرفع

الصلاحيات

يحترم مدير الوسائط الصلاحيات التالية:

الصلاحيةالإجراء
media.viewعرض قائمة الوسائط والوصول لصفحة مدير الوسائط
media.uploadرفع ملفات جديدة (إظهار/إخفاء منطقة الرفع)
media.deleteحذف الملفات (إظهار/إخفاء إجراء الحذف)

تعريفات الأعمدة

يعرض جدول البيانات الأعمدة التالية:

العمودالمحتوى
تحديدمربع اختيار للتحديد الجماعي
معاينةصورة مصغرة للصور، أيقونة نوع الملف للآخرين
اسم الملفاسم الملف الأصلي مع نوع MIME
النوعشارة تشير لنوع الملف (صورة، فيديو، PDF، مستند، ملف)
الحجمحجم الملف بصيغة مقروءة (KB/MB)
المجموعةالمجموعة التي ينتمي إليها الملف
تاريخ الرفعتاريخ الرفع
الإجراءاتنسخ الرابط، فتح في تبويب جديد، حذف

الوسائط المستقلة مقابل المرتبطة

يعرض مدير الوسائط جميع ملفات الوسائط بغض النظر عما إذا كانت مرتبطة بنموذج:

  • الوسائط المستقلة: الملفات المرفوعة مباشرة عبر مدير الوسائط (بدون model_type أو model_id)
  • الوسائط المرتبطة: الملفات المرتبطة بنموذج (مثل صور المستخدمين الشخصية، صور المحتوى)

كلا النوعين يظهران في مدير الوسائط للإدارة المركزية.

تحذير

حذف سجل النموذج الأب لا يحذف تلقائياً ملفات الوسائط المرتبطة. تأكد من أن معالجات الحذف تستدعي media_service.detach() لجميع الوسائط المرتبطة لتجنب الملفات اليتيمة في التخزين.

توليد متغيرات الصور

عند رفع ملف صورة، يُولّد النظام تلقائياً المتغيرات المُعدّة (thumbnail، medium، large). يتم تحديد أبعاد المتغيرات وإعدادات الجودة بواسطة إعدادات التطبيق.

yaml
# forge.yaml
media:
  variants:
    thumbnail:
      width: 150
      height: 150
      fit: cover
    medium:
      width: 600
      height: 400
      fit: contain
    large:
      width: 1200
      height: 800
      fit: contain

نصيحة

ينطبق توليد المتغيرات فقط على ملفات الصور (JPEG، PNG، WebP، GIF). الرفوعات غير الصور مثل PDFs أو المستندات تُخزّن كما هي بدون معالجة متغيرات.

Released under the MIT License.