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

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

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

نعم كلاهما ORM - Object Relational Mapper (سنتعرف على تفاصيله في الورشة القادمة), لكن حسب كلام صانع peewee:

SQLAlchemy is the gold standard for ORM in the Python world

يعني هو نفسه يقول أن SQLAlchemy هو أفضل ORM (ما أجمل الناس المتواضعين) :smile:

هذه مقارنة كتبها صانع peewee:

1 Like

هل تنصحني ان اخزن بيانات الصور في قاعدة البيانات ام انه لا داعي فانا اربط كل اسم صورة بال id الخاص بالكاتب وهو لا يتكرر

1 Like

ماذا تقصد ببيانات الصورة؟ تقصد filePath؟ او تقصد شي اخر؟

1 Like

هذا ما اقصده
ان يتم حفظ الا id وال path

1 Like

نعم فقط تحتاج تحفظ ال id وال path (لكي تعرف ماهو المسار لهذه الصورة)، وفي نفس الوقت يوجد علاقة بين user و photo

بحيث كل مستخدم لديه صورة واحدة، يعني في جدول المستخدم تحتاج ان تضيف حقل photo_id

1 Like

انا وجهة نظري انه يتم حفظ الصورة باسم الid الخاص باليوزر

1.jpg
2.jpg
..

وهكذا واحفظها في مجلد داخل photo خاص بالuser
وهكذا استطيع ان احصل عليها بسهولة.
ما رأيك؟؟

1 Like

طريقة جيدة، ربما ستواجه مشكلة مع صيغة الصورة :sweat_smile:

لكن انصحك بعدم تكرار اختراع العجلة… الطريقة الاعتيادية هي الاحتفاظ بمسار الملف على السيرفر وربطه جدول اليوزر بعلاقه one to one مع جدول الصور.

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

f = request.files['photo_url']
        f.save(path.join('static/images/authors', secure_filename(f.filename)))
        x = Authors.select(Authors.id).order_by(Authors.id.desc()).limit(1).where(Authors.name == request.form['name'])
        rename('static/images/authors/'+f.filename,'static/images/authors/'+str(x[0])+'.jpg')

1 Like

وعند الاستدعاء اقعل هذا

<img src='/static/images/authors/{{article.author.id}}.jpg'>
1 Like

لا مشكلة أبداً يا صهيب, أنا سعيد بالإجابة على أسئلتك :slight_smile:

الطريقة مناسبة, ولكن أنت تغير صيغة الملف دائماً إلى jpg, ربما المستخدم رفع ملف صيغته مختلفة.

شكرا جزيلا على رحابة صدرك
وهل هذا يؤثر اذا غيرت صيغة الملف ل jpg
؟؟؟

1 Like