欢迎访问宙启技术站
智能推送

通过Python开发的文件下载器,支持断点续传

发布时间:2023-12-13 07:28:43

实现一个文件下载器,支持断点续传功能,可以使用Python的requests库来实现。

首先,我们需要导入所需的库:

import requests
import os

接下来,我们定义一个Downloader类,其中包含下载文件的相关方法。

class Downloader:
    def __init__(self, url, filename):
        self.url = url
        self.filename = filename

    def get_size(self):
        response = requests.head(self.url)
        if response.status_code == 200:
            return int(response.headers['Content-Length'])
        else:
            raise Exception("Invalid URL")

    def download(self):
        size = self.get_size()
        if os.path.isfile(self.filename):
            downloaded_size = os.path.getsize(self.filename)
            headers = {"Range": f"bytes={downloaded_size}-{size}"}
            mode = "ab"
        else:
            headers = {}
            mode = "wb"
        response = requests.get(self.url, headers=headers, stream=True)
        with open(self.filename, mode) as file:
            for chunk in response.iter_content(chunk_size=8192):
                file.write(chunk)
        print("Download complete!")

在上面的代码中,__init__方法初始化下载器对象,接收文件的URL和输出文件名作为参数。

get_size方法发送HEAD请求获取文件的大小。

download方法负责实际的文件下载工作。使用requests.get方法发送GET请求,通过stream=True参数以流的方式获取文件内容。如果文件已存在,则通过设置headersRange字段来实现断点续传。如果文件不存在,则以写入二进制模式打开文件。

然后,我们可以使用下载器来下载文件。例如:

if __name__ == "__main__":
    url = "http://example.com/file.zip"
    filename = "file.zip"
    downloader = Downloader(url, filename)
    downloader.download()

以上代码指定了文件的URL和输出文件名。然后创建一个Downloader对象并调用download方法来开始下载。如果文件已存在,则会从上次下载停止的地方继续下载;否则,会从头开始下载。

这就是一个简单的文件下载器,支持断点续传功能的实现。你可以使用该下载器下载任何文件,并在需要时暂停、继续或重新下载文件。