كيف تضيف رفع الملفات إلى تطبيقك: التخزين والحدود والأمان
لإضافة رفع الملفات إلى تطبيقك، خزّن الملفات في التخزين الكائني (bucket)، لا على قرص الخادم ولا في قاعدة البيانات، واحفظ سجلاً صغيراً في قاعدة البيانات يضم مفتاح الملف والاسم والحجم والنوع والمالك. تحقق من حجم الملف ونوعه على الخادم، وقرر منذ البداية هل الملفات عامة (مثل صور المنتجات) أم خاصة (مثل الفواتير)، ولا تقدّم الملفات الخاصة إلا بعد التحقق من هوية الطالب. وفي أداة بناء تطبيقات بالذكاء الاصطناعي يمكنك وصف ميزة الرفع في أمر واحد؛ والجزء المهم هو اختبار أن الملفات تبقى بعد إعادة النشر وأن الشخص الخطأ لا يستطيع فتحها.
حدّد نوع الرفع الذي تحتاجه
قبل البناء، أجب عن ثلاثة أسئلة:
- أي ملفات؟ صور الملف الشخصي، وصور المنتجات، وملفات PDF، وجداول البيانات، والصوت، والفيديو. هذا يحدد حدود النوع والحجم.
- من يستطيع رؤيتها؟ الجميع (معرض عام)، أو الرافع والمشرفون فقط (عقود، ووثائق هوية، وملفات العملاء).
- ماذا يحدث بعد الرفع؟ مجرد حفظها، أو عرض معاينة، أو تغيير حجم الصور، أو قراءة محتواها.
الصور العامة والمستندات الخاصة تحتاج إلى إعدادين مختلفين، لذا حسمهما أولاً.
أين يجب أن تُحفظ الملفات
| الخيار | كيف يعمل | مناسب لـ | ما يجب الحذر منه |
|---|---|---|---|
| التخزين الكائني (bucket) | ملفات تُحفظ في خدمة مصممة لها؛ وقاعدة بياناتك تخزن مفتاحاً أو رابطاً | معظم التطبيقات | يجب ضبط قواعد الوصول بشكل صحيح |
| التخزين الذي توفره المنصة | أداة البناء أو الاستضافة تفعّل لك bucket | التطبيقات المبنية على تلك المنصة | الحدود والتسعير تتبع المنصة |
| قرص الخادم | ملفات تُكتب على نظام ملفات خادم التطبيق | التطوير المحلي فقط | تُمسح غالباً عند إعادة التشغيل أو إعادة النشر |
| داخل قاعدة البيانات | تُخزَّن بايتات الملف في جدول | نادراً جداً | تضخم قاعدة البيانات، وتُبطئ النسخ الاحتياطية |
| أداة رفع خارجية | خدمة رفع مستضافة تتولى التدفق كله | الوسائط الثقيلة، وتحويلات الصور | مزوّد آخر، وحساب آخر، وفاتورة أخرى |
لمعظم التطبيقات، يكون التخزين الكائني مع سجل في قاعدة البيانات هو الحل الصحيح. فصف قاعدة البيانات هو ما يستعلم عنه تطبيقك (مثلاً "اعرض مستندات هذا المستخدم")، أما bucket فيحتفظ بالبايتات فقط.
ملفات عامة مقابل ملفات خاصة
- الملفات العامة (صور المنتجات، وصور المدونة، والصور الرمزية) يمكن تقديمها من رابط عام. أي شخص يملك الرابط يستطيع فتحها، وهذا مقبول لهذا النوع من المحتوى.
- الملفات الخاصة (الفواتير، والعقود، والمستندات الطبية أو الهوية، وملفات تسليم العملاء) يجب ألا يكون لها أبداً رابط عام يمكن تخمينه. يتحقق الخادم من أن المستخدم المسجّل دخوله مالك للملف أو يملك صلاحية، ثم إما يبثّه إليه أو يعيد رابطاً موقّعاً (signed URL): رابط يعمل لفترة قصيرة فقط.
خطأ شائع وخطير هو تخزين ملفات خاصة في bucket عام بأسماء يمكن التنبؤ بها. أي شخص يخمّن /uploads/invoice-102.pdf سيحصل على فاتورة شخص آخر.
أمثلة على الأوامر
رفع صورة عامة:
اسمح للمشرفين برفع حتى 5 صور للمنتج الواحد. اقبل ملفات JPG وPNG وWebP بحد أقصى 5 ميغابايت لكل ملف. احفظ الملفات في تخزين الملفات، واحفظ مفتاح كل ملف وحجمه وترتيبه في جدول product_images، واعرض الصور المصغّرة مع زر حذف. تحقق من النوع والحجم على الخادم، لا في المتصفح فقط.
رفع مستند خاص:
أضف صفحة مستندات للعملاء المسجّلين دخولهم. يستطيع العملاء رفع ملفات PDF بحد أقصى 20 ميغابايت. الملفات خاصة: احفظها في تخزين الملفات، واحفظ معرّف المالك واسم الملف الأصلي والحجم ووقت الرفع في جدول documents، ولا تسمح بالتنزيل إلا للمالك والمشرفين. تمر التنزيلات عبر مسار على الخادم يتحقق من الصلاحية. لا تعرض أبداً رابطاً عاماً لهذه الملفات.
متابعات مفيدة:
اعرض شريط تقدّم أثناء الرفع، ورسالة خطأ واضحة إذا كان الملف كبيراً جداً أو من نوع خاطئ.
عند حذف صف مستند، احذف الملف المخزّن أيضاً.
خطوة بخطوة
- حدّد الأنواع وحدود الحجم لكل حقل رفع. كن محدداً: "PDF حتى 20 ميغابايت"، لا "مستندات".
- فعّل التخزين. في أداة بناء بالذكاء الاصطناعي، اطلب ميزة الرفع في المحادثة، وستجهّز التخزين بنفسها. وفي غيرها، أنشئ bucket وأضف بيانات اعتمادها كأسرار على الخادم.
- أنشئ جدولاً في قاعدة البيانات لسجلات الملفات: المعرّف، والمالك، ومفتاح التخزين، والاسم الأصلي، والنوع، والحجم، ووقت الإنشاء.
- ابنِ مسار الرفع على الخادم: تحقق من أن المستخدم مسجّل دخوله، وتحقق من النوع والحجم، واصنع مفتاح تخزين آمناً (لا تأخذه من اسم الملف الذي رفعه المستخدم)، واحفظ الملف، وأدرج السجل.
- ابنِ مسار التنزيل أو العرض: رابط عام للملفات العامة؛ ومسار يتحقق من الصلاحية أو رابط موقّع للملفات الخاصة.
- ابنِ الواجهة: منتقي ملفات، وسحب وإفلات إن كان مفيداً، وشريط تقدّم، ومعاينات، ورسائل خطأ.
- تعامل مع الحذف بحيث يؤدي حذف السجل إلى حذف الملف المخزّن.
- اختبر: ارفع ملفاً، وأعد تحميل الصفحة، وأعد النشر، وتحقق من أن الملف ما زال يُحمَّل. ثم سجّل الدخول بمستخدم آخر وحاول فتح الملف الخاص للمستخدم الأول.
أخطاء شائعة
- كتابة الملفات المرفوعة على قرص الخادم. يعمل ذلك في التطوير، ثم تختفي الملفات بعد إعادة التشغيل أو إعادة النشر.
- الثقة بفحوصات المتصفح. إعداد "accept" في حقل الملف مجرد تلميح، وليس أمناً. تحقق من النوع والحجم على الخادم.
- استخدام اسم الملف الذي رفعه المستخدم كمفتاح تخزين. الأسماء تتصادم وقد تحتوي على رموز غريبة. أنشئ مفتاحاً فريداً واحفظ الاسم الأصلي منفصلاً.
- bucket عام لملفات خاصة. انظر أعلاه؛ هذا هو الخطأ الذي يصنع الأخبار.
- السماح بأي نوع ملف. ملفات HTML أو SVG تُقدَّم من نطاقك قد تشغّل سكربتات في بعض الإعدادات. اقبل الأنواع التي تحتاجها فقط.
- عدم وجود حد للحجم. رفع ضخم واحد قد يستنزف مساحتك أو يتجاوز مهلة الطلب.
- ملفات يتيمة. حذف السجل دون الملف يملأ التخزين الذي تدفع ثمنه ببطء.
- نسيان الهاتف. صور الهواتف قد تكون كبيرة وبصيغ مثل HEIC؛ قرر هل تقبلها أم تحوّلها.
قائمة التحقق
- تذهب الملفات إلى التخزين الكائني، لا إلى قرص الخادم أو قاعدة البيانات
- لكل ملف سجل في قاعدة البيانات يضم المالك والمفتاح والاسم والنوع والحجم
- النوع والحجم يُتحقق منهما على الخادم
- مفاتيح التخزين تُولَّد ولا تُؤخذ من اسم الملف
- لا تُقدَّم الملفات الخاصة إلا بعد فحص الصلاحية
- مستخدم آخر لا يستطيع فتح ملفاتك الخاصة، حتى بالرابط
- حذف السجل يحذف الملف
- تبقى الملفات تُحمَّل بعد النشر أو إعادة النشر
- تظهر أخطاء الرفع بوضوح، بما في ذلك على الهاتف
رفع الملفات في Mythex
يستطيع Mythex تفعيل تخزين الملفات لمشروع تلقائياً عندما يحتاج تطبيقك إلى رفع ملفات، فلا تحتاج إلى تجهيز bucket يدوياً. ويمكنك أيضاً كتابة /storage في المحادثة. وهو متاح في خطتي Free وPro، مع سقف 1 GB في خطة Free، ويمكنك رؤية حالته من Settings ← Storage.
تنص الوثائق بوضوح على أن الاستضافة المنشورة ليست نظام ملفات محلياً دائماً، لذا اطلب من الوكيل استخدام تخزين المنصة بدلاً من الحفظ على القرص. تُدفع الملفات المخزّنة والتنزيلات من رصيد الاعتمادات، حسب الحجم وحسب كمية ما يُنزَّل؛ وخطة Pro تدفع نصف السعر المطبّق على Free. راجع تخزين الملفات في الوثائق.
عادةً ما يسير الرفع جنباً إلى جنب مع قاعدة بيانات لسجلات الملفات، ومع تسجيل الدخول للملفات الخاصة. وإذا كنت تبني مكاناً يتبادل فيه العملاء المستندات، فراجع كيف تبني بوابة عملاء، ثم مرّ على قائمة الأمان قبل الإطلاق.
الأسئلة
أين يجب تخزين الملفات المرفوعة؟
في التخزين الكائني (Object Storage)، أي خدمة مصممة للملفات وتُسمى غالباً bucket، لا على قرص خادم التطبيق ولا داخل قاعدة البيانات. واحفظ في قاعدة بياناتك مفتاح الملف أو رابطه فقط، إلى جانب تفاصيل مثل الاسم والحجم والمالك.
لماذا تختفي الملفات المرفوعة بعد النشر أو إعادة النشر؟
معظم منصات الاستضافة لا تحتفظ بقرص محلي دائم: عند إعادة تشغيل التطبيق أو إعادة نشره تُفقد الملفات المكتوبة على قرصه. احفظ الملفات المرفوعة في التخزين الكائني بدلاً من ذلك.
كيف أبقي الملفات المرفوعة خاصة؟
لا تجعل الملفات قابلة للقراءة للعامة. تحقق الخادم من أن المستخدم المسجّل دخوله مسموح له برؤية الملف، ثم أرسله له أو أعد له رابطاً موقّعاً قصير الصلاحية.
هل يدعم Mythex رفع الملفات؟
نعم. يستطيع Mythex تفعيل تخزين الملفات لمشروع عندما يحتاج التطبيق إلى رفع ملفات، وذلك في خطتي Free وPro، مع سقف 1 GB في خطة Free. تطلب من الوكيل ميزة الرفع، أو تكتب /storage.