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)

Înlocuiți URL-urile și numele fișierelor cu cele ale aplicației. Pentru o descărcare permisă a unui fișier public fără autentificare prin proxy, lista de proxy HTTP poate furniza puncte finale candidate pentru URL-ul proxy-ului. Acest opener urllib dedicat folosește un proxy HTTP pentru o destinație HTTPS cu verificarea normală a certificatului. Nu instalează un opener global; autentificarea, dacă este necesară, necesită configurarea sa acceptată.

copyfileobj copiază în blocuri. Ieșirea din contextul fișierului îl închide și golește scrierile tamponate înainte ca os.replace să instaleze numele final.

Dacă cererea sau copierea generează o eroare, redenumirea este omisă. Un fișier parțial poate rămâne pentru politica de curățare, iar acest flux lasă neatins un fișier final existent la acea eroare. În caz de succes, înlocuirea poate suprascrie acel fișier final, așa că alegeți politica în mod deliberat.

Folosiți nume temporare unice pentru lucrările concurente. Obiectele opener separate nu protejează lucrările care partajează aceeași cale .part.

Setarea de 20 de secunde limitează operațiile de socket acceptate, nu timpul total de descărcare. Un termen pentru întreaga lucrare necesită o gestionare separată în aplicație. Finalizarea transferului este, de asemenea, separată de verificarea fișierului descărcat.

Articole similare