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 সেকেন্ডের সেটিং মোট ডাউনলোড সময় নয়, সমর্থিত সকেট ক্রিয়াকলাপ সীমিত করে। পুরো কাজের সময়সীমার জন্য আলাদা অ্যাপ্লিকেশন হ্যান্ডলিং দরকার। স্থানান্তর সম্পূর্ণ হওয়াও ডাউনলোড করা ফাইল যাচাই থেকে আলাদা।

সম্পর্কিত নিবন্ধ