أعمل على انشاء موقع مدونة من خلال flask وأردت أن أسمح للمستخدم أن يرفع صور من كمبيوتره وليس عن طريق الرابط.
كيف يتم ذلك أنا استخدم قاعدة بيانات sqlite ?
أرجو المساعدة
اسهل طريقة لحفظ الصورة هي فقط الاحتفاظ بمسارها, يعني ترفعها كملف صورة عادي على السيرفر, وتقوم بتخزين مسار الملف (تأكد من حفظ الملف باسم غير موجود مسبقاً على السيرفر لضمان عدم حذف ملف صورة سابقة)
class Image
id => auto generated
path => random file name (not already existed)
هذا مثال جيد يقوم بالأمر:
تقصد ان انشئ ملف ضمن المشروع اسمه photos مثلا
واضع جميع الصور فيه، حتى العملاء الذين يريدون ان يضعوا صور سيتم جلب الصور وتخزينها في المجلد؟
نعم هذه هي الطريقة التقليدية للقيام بالأمر وأغلب الناس يحبوا هذه الطريقة.
الطريقة الحديثة هي باستعمال مزود خدمة لرفع الملفات, مثل amazon s3 (لأن ملفات الصور تضع بعض الثقل على السيرفر). لا تهتم بهذه الطريقة لأن الأسلوب العادي هو الأنسب في الكثير من الأحيان… الطريقة الحديثة في حال كان لديك ملايين المستخدمين على الموقع
ساعمل بهذه الطريقة اذا، وسأشاركك ذلك حين ما انتهي.
انتظر النتائج
لماذا لا يعطيني المسار كامل انما يعطيني اسم الصورة فقط عندما استدعي قيمته؟؟؟؟؟
عادي, الفكرة فقط لما تستخرج الملف:
request.files['file']
جرب وقل لي
هذا الخطأ
Bad Request
The browser (or proxy) sent a request that this server could not understand.
KeyError: ‘file’
طبعا أنا حاطه ضمن form
ما يخطر في بالي هو تجربة
request.files['photo_url']
وإذا لم يعمل سأجرب إضافة attribute اسمه enctype على الـ form بهذا الشكل:
<form action="{{url_for('your_action')}}" method="POST" enctype="multipart/form-data">
لو لم يعمل, ارفع لنا المشروع على github لكي نجرب
نعم فعلت
وحين طبعت النتيجة كانت هكذا
<FileStorage: 'WIN_20190407_14_06_49_Pro.jpg' ('image/jpeg')>
هذا المشروع على github
انظر في add_author.html
يرجى الاطلاع على المشروع كامل واعطاء ملاحظات ايضا لأننا بحاجة ملاحظاتكم
لو تعرف يا صهيب أنك كنت على الطريق الصحيح وكان بقي فقط تعمل save()
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
تمام مشي الحال استاذ ياسر
لكن هنالك مشكلة ما سببها ان الصور لا تظهر على الموقع
<img src='\images\authors\1.jpg'>
هل فلاسك يحتاج لاعدادات؟؟
ابارك جهودكم:rose:
نعم, لإظهار الصور المرفوعة, تحتاج لجعل مجلد photos داخل static لأنها تعتبر ملفات ستاتيكية مثل css و fonts
بالمناسبة, هذا الموضوع مفيد أيضاً (الطريقة الأصح هي أن تستعمل nginx لعرض الصور, لا تهتم بطريقة تطبيق ذلك لأنها ستشتتك لكن يجب أن تعرف أنها الطريقة الأصح):
هل سنتعرف عليها لاحقاً ؟؟
نعم بالتأكيد
رائع
لكن اذا ممكن ما هي وظيفة SQLAlchemy هل هي بديل عن peewee