Python 工具类实现大文件断点续传功能详解
作者:剑客阿良_ALiang 发布时间:2022-11-17 05:41:29
标签:Python,文件下载,断点续传
依赖
os、sys、requests
工具代码
废话不多说,上代码。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat Oct 23 13:54:39 2021
@author: huyi
"""
import os
import sys
import requests
def download(url, file_path):
# 重试计数
count = 0
# 第一次请求是为了得到文件总大小
r1 = requests.get(url, stream=True, verify=False)
total_size = int(r1.headers['Content-Length'])
# 判断本地文件是否存在,存在则读取文件数据大小
if os.path.exists(file_path):
temp_size = os.path.getsize(file_path) # 本地已经下载的文件大小
else:
temp_size = 0
# 对比一下,是不是还没下完
print(temp_size)
print(total_size)
# 开始下载
while count < 10:
if count != 0:
temp_size = os.path.getsize(file_path)
# 文件大小一致,跳出循环
if temp_size >= total_size:
break
count += 1
print(
"第[{}]次下载文件,已经下载数据大小:[{}],应下载数据大小:[{}]".format(
count, temp_size, total_size))
# 重新请求网址,加入新的请求头的
# 核心部分,这个是请求下载时,从本地文件已经下载过的后面下载
headers = {"Range": f"bytes={temp_size}-{total_size}"}
# r = requests.get(url, stream=True, verify=False)
r = requests.get(url, stream=True, verify=False, headers=headers)
# "ab"表示追加形式写入文件
with open(file_path, "ab") as f:
if count != 1:
f.seek(temp_size)
for chunk in r.iter_content(chunk_size=1024 * 64):
if chunk:
temp_size += len(chunk)
f.write(chunk)
f.flush()
###这是下载实现进度显示####
done = int(50 * temp_size / total_size)
sys.stdout.write("\r[%s%s] %d%%" % (
'█' * done, ' ' * (50 - done), 100 * temp_size / total_size))
sys.stdout.flush()
print("\n")
return file_path
代码说明:
1、重试次数可以自己修改,按照需求来,我这边是10次。
2、增加了进度条的打印,别问,好看就完了。
验证一下,我们准备个文件下载服务。上文件服务代码。代码对flask、gevent有依赖。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat Oct 23 19:53:18 2021
@author: huyi
"""
from flask import Flask, request, make_response, send_from_directory
from gevent.pywsgi import WSGIServer
from gevent import monkey
# 将python标准的io方法,都替换成gevent中的同名方法,遇到io阻塞gevent自动进行协程切换
monkey.patch_all()
app = Flask(__name__)
@app.route("/download", methods=['GET'])
def download_file():
get_data = request.args.to_dict()
file_path = get_data.get('fileName')
response = make_response(
send_from_directory('/Users/huyi/Movies/Videos',file_path,as_attachment=True))
response.headers["Content-Disposition"] = "attachment; filename={}".format(
file_path.encode().decode('latin-1'))
return response
if __name__ == '__main__':
WSGIServer(('0.0.0.0', 8080), app).serve_forever()
启动文件下载服务,测试下载代码
download('http://localhost:8080/download?fileName=test.mp4', '/Users/huyi/Downloads/test.mp4')
首先我们下载一部分,然后关闭,模拟下载一半的情况。
重新执行一下,把剩下的执行
OK,验证通过。
来源:https://huyi-aliang.blog.csdn.net/article/details/120926552


猜你喜欢
- 站长们是不是还在为空间不支持域名绑定到子目录而发愁呢?买了个便宜也不错的空间,用的还满意,准备再开几个网站,却发现空间程序太落后,无法支持域
- 1.私有属性和私有方法封装的意义:将属性和方法放到一起做为一个整体,然后通过实例化对象来处理;隐藏内部实现细节,只需要和对象及其属性和方法交
- 在asp代码中分页是有点麻烦的事情,个人在在代码编写过程中把分页代码写成了两个函数,虽然在功能上不是很完善,但对于一般的应用应该是满足的了。
- Python函数函数就是把具有独立功能的代码块封装成一个小模块,可以直接调用,从而提高代码的编写效率以及重用性, 需要注意的是, 函数需要被
- 为了更好的理解这些基本操作,下面会通过读取一个股票数据,来进行Pandas基本数据操作的语法介绍。# 读取文件(读取保存文件后面会专门进行讲
- PDOStatement::setAttributePDOStatement::setAttribute — 设置一个语句属性(PHP 5
- 保存模型保存模型仅仅是为了测试的时候,只需要torch.save(model.state_dict, path)path 为保存的路径但是有
- 前言相信大家在最近的chatGPT的注册或者使用过程中都遇到了很多很多的报错,接下来的内容是关于chatGPT不管是注册还是使用过程中所有报
- 前些天写一个存储过程,存储过程中使用了事务,后来我把一些代码注释掉来进行调试找错,突然发现一张表被锁住了,原来是创建事务的代码忘记注释掉。本
- Python安装过程,供大家参考,具体内容如下1.下载安装程序我们安装Python的一个重要目的是为了用IAR编译CC2640 OAD文件时
- 一、概述mysql主从是常用的高可用架构之一,也是使用最广泛的的系统架构。在生产环境中mysql主从复制有时会出现复制错误问题。MySQL主
- PDO::rollBackPDO::rollBack — 回滚一个事务(PHP 5 >= 5.1.0, PECL pdo >=
- 一、 申请企业微信账号,申请地址 https://qy.weixin.qq.com/二、 登陆企业微信账图一图二2、添加微信账号图
- Django中Models是什么:通常,一个Model对应一张数据表,Django中Models以类的形式表现,它包含一些基本字段以及数据的
- Python最近挺火呀,比鹿晗薛之谦还要火,当然是在程序员之间。下面我们看看有关Python的相关内容。上一篇文章我们已经介绍了部分Pyth
- 要将身份证的正反面图片合并为一张图片,你可以使用PHP的GD库来完成。演示了如何合并两张图片下面是一个示例代码,演示了如何合并两张图片://
- 一级行政区经纬度一级行政区(省级行政区):34个(23个省、5个自治区、4个直辖市、2个特别行政区)provinces = {
- 一、效果展示此次只选录了以下五种手势,当然你可以自己选择增加手势。二、项目实现原理首先通过opencv的手部检测器检测出我们的手,然后录入自
- 人工智能和区块链诞生至今已经有了十几年,当这些技术出现时,人们都说他们会改变世界,但至今为止,这两项技术对现实的影响依然有限。从技术上看人工
- python是一个很有趣的语言,可以在命令行窗口运行。python中有很多功能强大的模块,这篇经验告诉你,如何使用python的pygal模