رفع الوسائط على قاعدة بيانات MongoDB باستخدام Express.js

السلام عليكم يا اخوان

أعمل على مشروع باستخدام Node.js وExpress.js وأستخدم قاعدة بيانات MongoDB وتطلَّب مني أن أضيف إليه خاصية لرفع الوسائط على قاعدة البيانات ولكن قبل أن أضيفها أردت أن أعرف ما هي أفضل طريقة لرفع الوسائط كالصور مثلًا على قاعدة بيانات مونجو؟

هل:

أنشئ مجلد خاص داخل المشروع ثم تُحفظ الصور عليه ويتم حفظ مساراتها فقط داخل قاعدة البيانات

أم:

يُحفظ الكود المصدري للصور مباشرة داخلها!

مع ذكر محاسن وعيوب كل منهما، وإذا توفرت طريقة ثالثة لا بأس من ذكرها أيضًا.

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

أولا لرفع الوسائط (مثل الصور أو ملفات الفيديو) إلى قاعدة بيانات MongoDB باستخدام Express.js، يمكن اتباع الخطوات التالية:

1. تثبيت المكتبات:

تأكد من تثبيت مكتبة `multer` لمعالجة رفع الملفات و `mongoose` للتفاعل مع قاعدة بيانات MongoDB.

npm install multer mongoose express

2. تكوين Multer:

في ملف Express، قم بتكوين `multer` لمعالجة الوسائط.

const express = require('express');

const multer = require('multer');

const app = express();

const storage = multer.memoryStorage();

const upload = multer({ storage: storage });

// ربط المعالج بمسار معين

app.post('/upload', upload.single('file'), (req, res) => {

// يمكنك هنا التعامل مع البيانات المرفوعة وحفظها في MongoDB

const fileData = req.file.buffer; // البيانات الثنائية للملف

// اتصال بقاعدة البيانات وحفظ البيانات

// ...

res.send('تم رفع الملف بنجاح');

});

app.listen(3000, () => {

console.log('الخادم يعمل على المنفذ 3000');

});

3. تكوين Mongoose:

قم بتكوين اتصال مع قاعدة بيانات MongoDB باستخدام `mongoose`.

   const mongoose = require('mongoose');

   mongoose.connect('mongodb://localhost:27017/اسم-قاعدة-البيانات', {
     useNewUrlParser: true,
     useUnifiedTopology: true
   });

   const db = mongoose.connection;

   db.on('error', console.error.bind(console, 'خطأ في الاتصال بقاعدة البيانات:'));
   db.once('open', () => {
     console.log('تم الاتصال بقاعدة البيانات بنجاح');
   });
   ```

4. **حفظ الوسائط في MongoDB:**
   داخل المعالج المسؤول عن الرفع، استخدم Mongoose لحفظ الوسائط في قاعدة البيانات.

   ```javascript
   const mongoose = require('mongoose');

   const fileSchema = new mongoose.Schema({
     data: Buffer,
     contentType: String
   });

   const FileModel = mongoose.model('File', fileSchema);

   app.post('/upload', upload.single('file'), async (req, res) => {
     const fileData = req.file.buffer;
     const contentType = req.file.mimetype;

     const newFile = new FileModel({ data: fileData, contentType: contentType });
     await newFile.save();

     res.send('تم رفع الملف بنجاح');
   });

يجب التأكد من تعديل الأكواد وفقا لاحتياجات مشروع وتغيير اسم قاعدة البيانات والحقول المستخدمة وفقا لتصميم قاعدة البيانات الخاصة بكل مشروع.

شكرًا يا أخ محمد وجزاك الله خير الجزاء

العفو، في الخدمة أخي مازن.

أفضل طريقة لرفع الوسائط هي إنشاء مجلد خاص داخل المشروع ثم تحفظ الصور عليه ويتم حفظ مساراتها فقط داخل قاعدة البيانات بحيث

  • لا تزيد حجم قاعدة البيانات مما يجعلها أكثر كفاءة. 
  • يمكن الوصول إلى الوسائط مباشرة من المجلد دون الحاجة إلى استخراجها من قاعدة البيانات.
  • سهولة إضافة أو تعديل أو حذف الوسائط.

الطريقة الثانية هي حفظ الكود المصدري للصور مباشرة داخل قاعدة البيانات. لكنها لن تكون مفيدة لأنها ستزيد حجم قاعدة البيانات بشكل كبير.

هناك أيضًا طرق أخرى مثل استخدام خدمات تخزين الوسائط (مثل Amazon S3 أو Firebase Storage) وحفظ روابط الوسائط في قاعدة البيانات وهذه الطريقة جيدة أيضاً إذا كانت متوفره بالنسبة لك.

أشكرك يا أخ عبدالباسط وجزاك الله خير الجزاء

Mazen_Othman
  • حذف بواسطة المستخدم

الطريقة الاعتيادية لحفظ الصور والتعامل معها على مستوى التطبيقات هي في حفظها على مستوى أقراص التخزين والاحتفاظ بمسارات لها على قواعد البيانات، بغض النظر عما كان النظام المستخدم في قواعد البيانات.

رغم ذلك، هنالك طريقة أخرى لحفظ هاته الصور، وهي بتكويدها وحفظها كسلاسل نصية مكودة/مشفرة في قواعد البيانات، ولكل من الطريقتين ميزات وعيوب نذكر منها:

عيوب الطريقة الأولى - استخدام أقراص التخزين لحفظها بشكلها Binary:

  • الحاجة إلى التعامل مع الصور بفعالية أكبر، مثل التحقق من وجودها في الطلبية وحفظها إلى نظام التخزين باستخدام وحدات التخزين وما الى ذلك.

ميزاتها:

  • لامحدودية التخزين
  • تشكل ضغطا أقل على قواعد البيانات
  • معتمدة وأكثر احترافية
  • قابلة الأرشفة من محركات البحث
  • لا تأخذ مساحة من قواعد البيانات

أما عن عيوب الطريقة الثانية - حفظها كسلاسل مشفرة مثل Encoded base64 strings:

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

ميزاتها:

  • سهلة وسريعة للتطبيق

وعليه، فالطريقة الأولى أفضل بكثير. إلا ان تطلبت حاجة المشروع الطريقة الثانية.

أشكرك كثيرا يا أخ عدنان كفيت ووفيت جزاك الله خيرًا