Straumēt starpniekservera lejupielādi failā ar Python urllib
Straumējiet starpniekservera lejupielādi pagaidu failā un publicējiet galīgo faila nosaukumu tikai pēc kopēšanas pabeigšanas.
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)Aizstājiet URL un failu nosaukumus ar lietojumprogrammas vajadzīgajiem. Atļautai publiskas faila lejupielādei bez starpniekservera autentifikācijas HTTP starpniekserveru saraksts var nodrošināt kandidātgalapunktus starpniekservera URL. Šis īpašais urllib atvērējs izmanto HTTP starpniekserveri HTTPS galamērķim ar parasto sertifikāta pārbaudi. Tas neinstalē globālu atvērēju; autentifikācija, ja nepieciešama, prasa tā atbalstīto iestatījumu.
copyfileobj kopē pa daļām. Izeja no faila konteksta to aizver un iztukšo buferētos rakstījumus, pirms os.replace iestata galīgo nosaukumu.
Ja pieprasījums vai kopēšana izraisa kļūdu, pārdēvēšana tiek izlaista. Saskaņā ar tīrīšanas politiku var palikt daļējs fails, un šī plūsma atstāj esošo galīgo failu neskartu šajā kļūmē. Veiksmes gadījumā aizstāšana var pārrakstīt šo galīgo failu, tāpēc izvēlieties politiku apzināti.
Izmantojiet unikālus pagaidu nosaukumus vienlaicīgiem darbiem. Atsevišķi atvērēja objekti neaizsargā darbus, kas koplieto vienu un to pašu .part ceļu.
20 sekunžu iestatījums ierobežo atbalstītās ligzdas darbības, nevis kopējo lejupielādes laiku. Visam darbam nepieciešams atsevišķs termiņš lietojumprogrammā. Pārsūtīšanas pabeigšana arī ir atsevišķa no lejupielādētā faila pārbaudes.