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 δευτερολέπτων περιορίζει τις υποστηριζόμενες λειτουργίες υποδοχής και όχι τον συνολικό χρόνο λήψης. Μια προθεσμία για ολόκληρη την εργασία απαιτεί ξεχωριστό χειρισμό στην εφαρμογή. Η ολοκλήρωση της μεταφοράς είναι επίσης ξεχωριστή από την επαλήθευση του ληφθέντος αρχείου.

Σχετικά άρθρα