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

كيفية إرجاع صورة مخزنة في قاعدة البيانات في فلاسك Flask؟

Mohssen A Mohssen

السؤال

لدي مجموعة من الصور مخزنة في قاعدة بيانات MongoDB وحاولت أن أقوم بجلب أحد هذه الصور وإرسالها من خلال الكود التالي:

@app.route("/images/<image_id>.jpg")
def load_image(image_id):
    # يتم هنا جلب الصور في شكل bson.Binary
    
    return image_binary

لكن يبدو أنه لا يمكن إرجاع قيمة ثنائية Binary من خلال فلاسك Flask.

كيف يمكنني أن أقوم بإرجاع هذه الصور، هل يجب أن أقوم بتحويلها إلى base64 ثم إرجاع هذه القيمة أم يوجد طريقة أخرى؟

تم التعديل في بواسطة Mohssen A Mohssen
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

يمكنك حل هذه المشكلة من خلال إنشاء كائن Response (عبر الدالة make_response) وتحديد الترويسة Content-Type لتكون من نوع الصورة مثل image/jpeg ، وإن أردت أن يتم تحميل الصورة وحفظها بدلًا من عرضها على الشاشة فيجب أن تقوم بتحديد التوريسة Content-Disposition لتحمل القيمة attachment، على النحو التالي:

@app.route('/images/<image_id>.jpg')
def load_image(image_id):
    image_binary = read_image(image_id)	# يتم هنا جلب الصور في شكل bson.Binary
    
    response = make_response(image_binary)
    response.headers.set('Content-Type', 'image/jpeg')
    
    # لتحميل الصورة وحفظها بدلًا من عرضها
    response.headers.set('Content-Disposition', 'attachment', filename='%s.jpg' % image_id)
    
    return response

يمكنك أيضًا أن تستعمل الدالة send_file لإرسال كائن من نوع io.BytesIO:

from flask import Flask, send_file

@app.route("/images/<image_id>.jpg")
def load_image(image_id):
    image_binary = read_image(image_id)	# يتم هنا جلب الصور في شكل bson.Binary

    return send_file(
          io.BytesIO(image_binary), 
          mimetype='image/jpeg', 
          as_attachment=True, 
          attachment_filename='%s.jpg' % image_id
        )

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

رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...