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)

Thay các URL và tên tệp bằng của ứng dụng. Đối với một bản tải xuống tệp công khai được phép mà không có xác thực proxy, danh sách proxy HTTP có thể cung cấp các điểm cuối ứng viên cho URL proxy. Trình mở urllib chuyên dụng này dùng proxy HTTP cho đích HTTPS với xác minh chứng chỉ thông thường. Nó không cài đặt trình mở toàn cục; xác thực, nếu cần, yêu cầu thiết lập được hỗ trợ của nó.

copyfileobj sao chép theo từng khối. Thoát khỏi ngữ cảnh tệp sẽ đóng tệp và đẩy các lần ghi trong bộ đệm ra trước khi os.replace đặt tên cuối cùng.

Nếu yêu cầu hoặc quá trình sao chép gây lỗi, việc đổi tên bị bỏ qua. Một tệp dở dang có thể còn lại theo chính sách dọn dẹp, và luồng này để tệp cuối cùng hiện có không bị động đến khi thất bại đó. Khi thành công, việc thay thế có thể ghi đè tệp cuối cùng đó, nên hãy chọn chính sách một cách có chủ đích.

Dùng tên tạm thời duy nhất cho các công việc đồng thời. Các đối tượng trình mở riêng biệt không bảo vệ những công việc dùng chung một đường dẫn .part.

Cài đặt 20 giây giới hạn các thao tác socket được hỗ trợ, không phải tổng thời gian tải xuống. Thời hạn cho toàn bộ công việc cần xử lý riêng trong ứng dụng. Việc hoàn tất truyền cũng tách biệt khỏi việc xác minh tệp đã tải xuống.

Bài viết liên quan