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 ओपनर सामान्य प्रमाणपत्र सत्यापन के साथ HTTPS गंतव्य के लिए HTTP प्रॉक्सी का उपयोग करता है। यह वैश्विक ओपनर स्थापित नहीं करता; यदि आवश्यक हो तो प्रमाणीकरण के लिए इसका समर्थित सेटअप चाहिए।

copyfileobj टुकड़ों में प्रतिलिपि बनाता है। फ़ाइल संदर्भ से बाहर निकलने पर वह बंद हो जाती है और os.replace अंतिम नाम स्थापित करने से पहले बफ़र किए गए लेखन को फ़्लश कर देती है।

यदि अनुरोध या प्रतिलिपि त्रुटि उठाती है, तो नाम बदलना छोड़ दिया जाता है। सफ़ाई नीति के लिए आंशिक फ़ाइल रह सकती है, और यह प्रवाह उस विफलता में मौजूद अंतिम फ़ाइल को अछूता छोड़ देता है। सफल होने पर प्रतिस्थापन उस अंतिम फ़ाइल को अधिलिखित कर सकता है, इसलिए नीति सचेत रूप से चुनें।

समवर्ती कार्यों के लिए अद्वितीय अस्थायी नाम उपयोग करें। अलग ओपनर ऑब्जेक्ट एक ही .part पथ साझा करने वाले कार्यों की रक्षा नहीं करते।

20 सेकंड की सेटिंग कुल डाउनलोड समय के बजाय समर्थित सॉकेट संचालन को सीमित करती है। पूरे कार्य की समय-सीमा के लिए एप्लिकेशन में अलग हैंडलिंग चाहिए। स्थानांतरण पूरा होना भी डाउनलोड की गई फ़ाइल के सत्यापन से अलग है।

संबंधित लेख