كيف يتم حفظ الصور في قاعدة البيانات؟؟

أعمل على انشاء موقع مدونة من خلال flask وأردت أن أسمح للمستخدم أن يرفع صور من كمبيوتره وليس عن طريق الرابط.
كيف يتم ذلك أنا استخدم قاعدة بيانات sqlite ?
أرجو المساعدة

2 Likes

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

class Image
    id => auto generated
    path => random file name (not already existed)
1 Like

هذا مثال جيد يقوم بالأمر:

1 Like

تقصد ان انشئ ملف ضمن المشروع اسمه photos مثلا
واضع جميع الصور فيه، حتى العملاء الذين يريدون ان يضعوا صور سيتم جلب الصور وتخزينها في المجلد؟

1 Like

نعم هذه هي الطريقة التقليدية للقيام بالأمر وأغلب الناس يحبوا هذه الطريقة.

الطريقة الحديثة هي باستعمال مزود خدمة لرفع الملفات, مثل amazon s3 (لأن ملفات الصور تضع بعض الثقل على السيرفر). لا تهتم بهذه الطريقة لأن الأسلوب العادي هو الأنسب في الكثير من الأحيان… الطريقة الحديثة في حال كان لديك ملايين المستخدمين على الموقع :smile:

1 Like

ساعمل بهذه الطريقة اذا، وسأشاركك ذلك حين ما انتهي.
:cherry_blossom::cherry_blossom:

1 Like

انتظر النتائج :wink: :wink:

1 Like

%E2%80%8F%E2%80%8F%D9%84%D9%82%D8%B7%D8%A9%20%D8%A7%D9%84%D8%B4%D8%A7%D8%B4%D8%A9%20(1)

لماذا لا يعطيني المسار كامل انما يعطيني اسم الصورة فقط عندما استدعي قيمته؟؟؟؟؟

1 Like

عادي, الفكرة فقط لما تستخرج الملف:

request.files['file']

جرب وقل لي

هذا الخطأ

Bad Request
The browser (or proxy) sent a request that this server could not understand.

KeyError: ‘file’

1 Like

طبعا أنا حاطه ضمن form

1 Like

ما يخطر في بالي هو تجربة

request.files['photo_url']

وإذا لم يعمل سأجرب إضافة attribute اسمه enctype على الـ form بهذا الشكل:

<form action="{{url_for('your_action')}}" method="POST" enctype="multipart/form-data">

لو لم يعمل, ارفع لنا المشروع على github لكي نجرب

1 Like

نعم فعلت
وحين طبعت النتيجة كانت هكذا

<FileStorage: 'WIN_20190407_14_06_49_Pro.jpg' ('image/jpeg')>
1 Like

هذا المشروع على github
انظر في add_author.html
يرجى الاطلاع على المشروع كامل واعطاء ملاحظات ايضا لأننا بحاجة ملاحظاتكم

1 Like

لو تعرف يا صهيب أنك كنت على الطريق الصحيح وكان بقي فقط تعمل save() :smile:

        f = request.files['photo_url']
        f.save(os.path.join('photos', secure_filename(f.filename)))

لا تنسى عمل import للدالة secure_filename (والتي تقوم بحماية السيرفر خاصتك من اسماء الملفات الغريبة):

from werkzeug import secure_filename

هنا تفصيل الدالة: https://werkzeug.palletsprojects.com/en/0.14.x/utils/#werkzeug.utils.secure_filename

  • لاحظ في الشرح أنها تقول لك أنها لا تضمن لك التحقق من ان الملف غير موجود مسبقاً (إنتاج اسم unique - غير موجود مسبقاً, ليست من ضمن وظائف هذه الدالة).

ولو تريد حفظ الملف داخل مجلد photos, استعمل os.path.join (لأنها الطريقة الأسلم لو كان السيرفر لينكس أو ويندوز أو ماك):

        f.save(os.path.join('photos', secure_filename(f.filename)))

ولا تنسى اضافة import os, وأيضاً لا تنسى عمل المجلد photos

بالنسبة للعمل فهو بشكل عام جيد, بإلإمكان تحسينه باستعمال SQLAlchemy :wink:

1 Like

تمام مشي الحال استاذ ياسر
لكن هنالك مشكلة ما سببها ان الصور لا تظهر على الموقع

<img src='\images\authors\1.jpg'>

هل فلاسك يحتاج لاعدادات؟؟

ابارك جهودكم:rose::rose:

1 Like

نعم, لإظهار الصور المرفوعة, تحتاج لجعل مجلد photos داخل static لأنها تعتبر ملفات ستاتيكية مثل css و fonts

بالمناسبة, هذا الموضوع مفيد أيضاً (الطريقة الأصح هي أن تستعمل nginx لعرض الصور, لا تهتم بطريقة تطبيق ذلك لأنها ستشتتك لكن يجب أن تعرف أنها الطريقة الأصح):

1 Like

هل سنتعرف عليها لاحقاً ؟؟

1 Like

نعم بالتأكيد :wink:

1 Like

رائع
لكن اذا ممكن ما هي وظيفة SQLAlchemy هل هي بديل عن peewee

1 Like