import os
import shutil
from urllib.request import ProxyHandler, build_opener

proxy = 'http://proxy.example.net:8080'
opener = build_opener(ProxyHandler({
    'http': proxy,
    'https': proxy,
}))

temporary = 'archive.zip.part'
destination = 'archive.zip'

with opener.open('https://downloads.example.net/archive.zip',
                 timeout=20) as response:
    with open(temporary, 'wb') as output:
        shutil.copyfileobj(response, output)

os.replace(temporary, destination)

استبدل عناوين URL وأسماء الملفات بما يناسب التطبيق. ولتنزيل ملف عام مسموح به دون مصادقة وكيل، يمكن أن توفّر قائمة وكلاء HTTP نقاط نهاية مرشحة لعنوان URL الخاص بالوكيل. يستخدم فتّاح urllib المخصص هذا وكيل HTTP لوجهة HTTPS مع التحقق المعتاد من الشهادة. وهو لا يثبّت فتّاحًا عامًا؛ والمصادقة، إن لزمت، تتطلب إعدادها المدعوم.

ينسخ copyfileobj على شكل أجزاء. والخروج من سياق الملف يغلقه ويُفرغ الكتابات المخزّنة مؤقتًا قبل أن يثبّت os.replace الاسم النهائي.

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

استخدم أسماء مؤقتة فريدة للمهام المتزامنة. فكائنات الفتّاح المنفصلة لا تحمي المهام التي تتشارك المسار نفسه .part.

يحدّ إعداد 20 ثانية من عمليات المقبس المدعومة، لا من زمن التنزيل الكلي. أما المهلة الكلية للمهمة فتتطلب معالجة تطبيقية منفصلة. كما أن اكتمال النقل منفصل عن التحقق من الملف المنزّل.

مقالات ذات صلة