اذهب إلى المحتوى

السؤال

نشر (معدل)

السلام عليكم..

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

سؤالي هو كل مرة يتم تخزين صورة في قاعدة البيانات يتم حفظها في مسار الملف لدي على جهاز الحاسب (يتم تخزينها في الحاسب) و انا لا اريد ذلك لانه ستتم تخزين كمية مهولة من الصور على حاسبي هل هناك طريقة  لكي لاتقوم الصور بالتخزين على جهازي ؟ 

على سبيل المثال: 

const fs = require('fs');
const path = require('path');

exports.write = (base64String, fileName) => {
    var buffer =  Buffer.from(base64String, 'base64');
    fs.writeFile(`${__dirname}/images/${fileName}.jpg`, buffer, (error) => {
        if(error) {
            console.log(error)
        }
    });

    // الملف الذي تخزن فيه الصور
    return `/images/${fileName}.jpg`;
}

شكرا. 

تم التعديل في بواسطة Samer Alashqar

Recommended Posts

  • 0
نشر
بتاريخ 43 دقائق مضت قال Samer Alashqar:

mongoDB

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

بما أن الصورة هي بالأصل base64String يمكنك تخزينها نفسها في قاعدة البيانات لنموذج فيه الصورة عبارة عن string مع تحديده ك buffer لزيادة سرعة تبادل البيانات فيه.

مثلاً نموذج ما فيه حقل للصورة:

var imageSchema = new mongoose.Schema({
    name: String,
    desc: String,
    img:
    {
        data: Buffer,
        contentType: String
    }
});

وعند إنشاء كائن من النموذج نمرر البيانات و نحفظ بالدالة save

exports.saveImageIntoMongoDatabase = (base64String, name, desc) => {
  
  var new_imageSchema = new imageSchema({
    name: name,
    desc: desc,
    img:  base64String
  })

  new_imageSchema.save(function(err,result){
    if (err){
      console.log(err);
    }
    else{
      console.log(result)
    }
  })
}

إن كانت الصورة نموذج بحد ذاتها، أي يمكنك حفظ جميع صور المشروع بنفس الوثيقة و ربطها مع باقي النماذج تحتاج لتحديد نوع النموذج المربوطة به مثل type: user أو type: post مثلاً مع id للغرض المرتبطة معه.

و إن وضعهتها كخاصية في نموذج ما، عاملها كسلسلة نصية مثل اسم المستخدم.

imageSchema.find({ name: 'photo', desc .., }, function (err, image) {
    if (err){
        console.log(err);
    }
    else{
        console.log("حصلنا على الصورة ن من قاعدة البيانات : ", image);
    }
});

يمكنك عرضها مباشرة ضمن وسم الصورة بالخاصية src

<img src="data:image/jpeg;base64,iVBORw0fiowfiowohsMwEIbpIzDA6FaMMPYJkDKzVYU+QFeEGPIKfYU8AETkCYI6wANkZQwIKRNDB1hA0Jrf0rk6WXZ8BvWkb4kv99vn89kDrfVexBSYgVNwDA7AN+jAK3gEd+AlGMGIBFDufwiORK5CYII=">

 

  • 0
نشر
بتاريخ 19 ساعات قال Wael Aljamal:

بما أن الصورة هي بالأصل base64String يمكنك تخزينها نفسها في قاعدة البيانات لنموذج فيه الصورة عبارة عن string مع تحديده ك buffer لزيادة سرعة تبادل البيانات فيه.

 

المثال السابق الذي جلبته في سؤالي كان مجرد مثال ..

الصورة التي اريد ارسالها ليست base64 كيف اقوم بارسالها الى قاعدة البيانات باستخدام ajax jquery ؟ ثم تخزينها في ملف لوحده ؟

  • 0
نشر
بتاريخ 5 ساعات قال Samer Alashqar:

الصورة التي اريد ارسالها ليست base64 كيف اقوم بارسالها الى قاعدة البيانات باستخدام ajax jquery ؟ ثم تخزينها في ملف لوحده ؟

إن أي ملف هو عبارة عن سلسلسة نصية من المحارف والأرقام، مع وجود ترويسة تعبر عن نوعية محتواه.

بعد جلب محتوى وسم الصورة باستخدام جيكويري ستكون عبارة عن سللسة نصية نرسلها للمخدم على شكل formData

var url = "url/action";                
// جلب الصورة
var image = $('#image-id').attr('src');
// توحيد تنسيق الصور
var base64ImageContent = image.replace(/^data:image\/(png|jpg);base64,/, "");
var blob = base64ToBlob(base64ImageContent, 'image/png');          
// لتقسم الملف على أجزاء
var formData = new FormData();
// إسناد الصورة
formData.append('picture', blob);
// إرسال طلب أجاكس
$.ajax({
  url: url, 
  type: "POST", 
  cache: false,
  contentType: false,
  processData: false,
  data: formData
})
.done(function(e){
  alert('done!');
});

يمكنك الاستفادة أيضا من الشرح:

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...