Python 工具类实现大文件断点续传功能详解

作者:剑客阿良_ALiang 时间:2022-11-17 05:41:29 

依赖

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')

首先我们下载一部分,然后关闭,模拟下载一半的情况。

Python 工具类实现大文件断点续传功能详解

重新执行一下,把剩下的执行

Python 工具类实现大文件断点续传功能详解

OK,验证通过。

来源:https://huyi-aliang.blog.csdn.net/article/details/120926552

标签:Python,文件下载,断点续传
0
投稿

猜你喜欢

  • 解析SQL Server与ASP互操作的时间处理

    2009-02-01 16:40:00
  • SQL Server日期加减函数DATEDIFF与DATEADD用法分析

    2024-01-21 12:06:11
  • golang elasticsearch Client的使用详解

    2024-05-28 15:24:41
  • vue实现输入框的模糊查询的示例代码(节流函数的应用场景)

    2024-05-08 09:33:35
  • python使用pyaudio录音和格式转化方式

    2023-11-07 19:30:03
  • 基于python中的TCP及UDP(详解)

    2023-12-22 19:54:38
  • 对MySQL几种联合查询的通俗解释

    2024-01-18 17:44:40
  • Python循环语句介绍

    2021-04-19 20:04:42
  • 由浅到深了解JavaScript类

    2008-06-16 13:20:00
  • uni-app使用countdown插件实现倒计时

    2024-05-10 14:15:14
  • python异常处理try的实例小结

    2022-01-25 06:06:51
  • Flask处理Web表单的实现方法

    2021-10-20 17:13:36
  • Python中Numpy ndarray的使用详解

    2022-08-08 19:03:05
  • JS实现div居中示例

    2024-04-28 09:47:39
  • python实现学生信息管理系统

    2021-11-27 11:46:42
  • asp 性能测试报告 学习asp朋友需要了解的东西

    2011-03-09 10:57:00
  • Python常用数字处理基本操作汇总

    2021-01-06 12:56:28
  • python将字符串转换成数组的方法

    2021-03-04 20:09:54
  • 如何理解PHP程序执行的过程原理

    2023-10-08 14:45:10
  • python通过pil将图片转换成黑白效果的方法

    2021-07-17 22:13:16
  • asp之家 网络编程 m.aspxhome.com