تحميل ملف الى العميل باستخدامflask

السلام عليكم اخوتي
بعد اكمالي للجزء الخاص ب backed حاولت ترجمة ما تعلمته في عمل صغير انعش به ذاكرتي ،،،ولكن وصلت إلى نقطة اين عجزت فيها ،،
المشكل الذي صادفني اني اريد تحميل ملف الى العميل في الوقت الذي اكون في في السيرفر أحمله ،،،يعني لتفادي تحميل الملف على السيرفر ومن ثم تحميله للعميل ،،هذا سيستغرق وقت خصوصا اذا كان الملف كبير ،،،ارجو من الإخوة المساعدة ،،وما اذا كان هناك حل ،،دون الحاجة إلى تحميل الملف على السيرفر ومن ثم الى العميل ^^

3 Likes

هل تقصد رفع ملف صورة مثلاً؟

يوجد نقاش حول هذا الموضوع هنا:

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

بالتأكيد، كما هو نفس الأمر عندما ترفع فيديو على فيسبوك أو واتس اب… كلما كبر حجم الملف كلما طال الأمر :smile:

لكن أغلب السيرفرات (حتى واتساب) يعمل حد limit على الحجم مثلاً 50 م.ب للفيديو

بإمكانك أن تقوم بنفس الأمر، بهذا تضمن:

  1. ان المستخدم لن يأخذ وقت طويل في رفع الملفات
  2. ان السيرفر خاصتك مساحته لن تمتلئ بسرعة

اهلا استاذ @YaserAlnajjar
ربما لم أوضح سؤالي جيدا،،ما قصدته هو أنني أعمل على إنشاء موقع بحيث العميل ينزل منه وليس يرفع إليه ،،،ولكن مشكلتي أنني أنا أيضا على السيرفر سؤحمل ما سيطلبه العميل من موقع آخر ومن ثم انزله للعميل ،،،اي انا احمل من سيرفر اخر إلى السيرفر الخاص بي ومن ثم العميل يحمل من عندي ،،السؤال هو : كيف يمكنني تحويل البيانات أثناء تحميلها ،الى العميل دون الحاجة إلى تحميلها عندي ^^
اتمنى اني وضحت سؤالي ،،،شكرا استاذي ^^

1 Like

هممم لو ممكن تذكر مثال أوضح، ماهي نوعية البيانات التي تريد نقلها؟ فلم مثلاً؟

دعنا أولاً نتحدث عن كيف يعمل الانترنت أمامنا… في متصفح كروم مثلاً

الانترنت اغلبه مبني على بروتوكول http (النسخة الآمنة https)

يأتي الـ client يطلب من السيرفر البيانات بارسال طلب GET

مثلاً على موقع قوقل متصفح كروم يطلب من موقع قوقل أن يجلب بيانات الصفحة HTML بارسال الطلب بهذا الشكل:

GET https://www.google.com/

والرد يأتي

<!doctype html>
<html itemscope="" itemtype="http://schema.org/WebPage" lang="en-CY">
    <head>
        <meta charset="UTF-8">
        <meta content="origin" name="referrer">
        <title>Google</title>
    </head>
...

وقتها سيقوم بعرض الصفحة في كروم.

نفس الأمر لما الـ client يطلب من السيرفر ملف سيطلبه بنفس الشكل GET url والسيرفر سيرجع بيانات الملف.

بناء سيرفر يقوم بتحميل الملفات

لو كنت تعمل على برمجة سيرفر لتحميل الملفات بهذا الشكل:

  1. يكتب لك اليوزر الرابط url للملف الذي تريد تحميله

  2. يقوم السيرفر الخاص بك بتحميل الملف عليه من سيرفر آخر

  3. بإمكان اليوزر تحميل الملف من السيرفر الخاص بك

غالباً، هنا أنت تحاول حل مشكلة النقل البطئ للملفات من بعض السيرفرات البطيئة… ولكن هذا سيسبب ثقل كبير على سيرفرك (مع زيادة عدد المستخدمين).

حل مشكلة ثقل السيرفر الخاص بك

لو تريد أن تجعل تحميل الملف ليس من سيرفرك، بإمكانك اضافة خطوة: يقوم السيرفر الخاص بك بإرسال الملف على سيرفر آخر سريع مخصص لتحميل الملفات لملايين المستخدمين.

لتصبح الخطوات كالتالي:

  1. يكتب لك اليوزر الرابط url للملف الذي تريد تحميله

  2. يقوم السيرفر الخاص بك بتحميل الملف عليه من سيرفر آخر

  3. يرفع السيرفر الخاص بك الملف على خدمة رفع ملفات سريعة جداً

  4. بإمكان اليوزر تحميل الملف الرابط المنتج من خدمة رفع الملفات بدون التثقيل على السيرفر خاصتك

أحد هذه الخدمات هي DigitalOcean Spaces وهي تقليد لخدمة Amazon S3 ولكنها أبسط وسعرها واضح… 5 دولار بالشهر مقابل:

  • 250 قيقا بايت تخزين.
  • 1 تيرا بايت تحميل.

هذه تفاصيل الخدمة: https://www.digitalocean.com/products/spaces/

وبالنسبة لكيفية استعمالها مع بايثون، فقط تأخذ الـ secret key من حسابك وعنوان الـ DigitalOcean Space وترفع عليها الملفات

هذا شرح مفصل: https://medium.com/@tatianatylosky/uploading-files-with-python-using-digital-ocean-spaces-58c9a57eb05b

1 Like

شكرا جزيلا استاذ @YaserAlnajjar
على المساعدة وعلى الشرح ^^

1 Like