Alirkan unduhan melalui proksi ke berkas dengan Python urllib
Alirkan unduhan melalui proksi ke berkas sementara dan terbitkan nama berkas akhir hanya setelah penyalinan selesai.
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)Ganti URL dan nama berkas sesuai aplikasi. Untuk unduhan berkas publik yang diizinkan tanpa autentikasi proksi, daftar proksi HTTP dapat menyediakan titik akhir kandidat untuk URL proksi. Pembuka urllib khusus ini memakai proksi HTTP untuk tujuan HTTPS dengan verifikasi sertifikat normal. Ia tidak memasang pembuka global; autentikasi, bila diperlukan, membutuhkan penyiapannya yang didukung.
copyfileobj menyalin per potongan. Keluar dari konteks berkas menutupnya dan mengosongkan tulisan yang tertampung sebelum os.replace memasang nama akhir.
Jika permintaan atau penyalinan memunculkan kesalahan, penggantian nama dilewati. Berkas sebagian dapat tersisa untuk kebijakan pembersihan, dan alur ini membiarkan berkas akhir yang ada tidak tersentuh pada kegagalan itu. Jika berhasil, penggantian dapat menimpa berkas akhir tersebut, jadi pilih kebijakannya dengan sengaja.
Gunakan nama sementara yang unik untuk pekerjaan bersamaan. Objek pembuka yang terpisah tidak melindungi pekerjaan yang berbagi jalur .part yang sama.
Setelan 20 detik membatasi operasi soket yang didukung, bukan total waktu unduhan. Tenggat untuk seluruh pekerjaan memerlukan penanganan terpisah di aplikasi. Selesainya transfer juga terpisah dari verifikasi berkas yang diunduh.