断点续传的实现

文章目录

  • 从上次断开位置继续下载
    • 实现原理(客户端):
    • HTTP实现(流程):
      • 图1: 客户端 Range头部信息
      • 图2:服务端Content-Range信息
    • 客户端与服务端的请求与响应图解:
    • 获取文件 ETag 的函数:
    • 下载文件(断点续传) 的函数:

从上次断开位置继续下载

HTTP断点续传:

实现原理(客户端):

1.客户端保存当前已下载文件的位置或大小。
2.在下次请求时告诉服务端自己请求的是哪一区间的数据。
3.服务端根据请求中的范围,从文件指定位置取出区间范围的数据进行响应。
关键问题:上次下载文件跟本次断点续传请求文件不一致(上次断开后,文件数据发生改变)
一旦上次断开后文件数据发生了改变,就算客户端请求的是区间数据,也为了防止数据不一致重新返回完整的文件数据

HTTP实现(流程):

1.服务端对客户的响应中加:	Accept-Ranges:bytes  	表示自己支持断点续传。同时需要在响应中加入: ETag:“文件唯一标识符”  (判断文件是否发生变化)2.客户端在断点续传时,通过字段if-Range:Etag的值,告诉服务端文件是否发生改变,如果没改变则断点续传,改变则下载完整。客户端在断点续传时,通过字段Range:bytes=200-1000,2000-3423,5000- 告诉服务器请求那部分数据。如图1:3.服务器根据断点续传中的if-Rang 和 Range 字段确定是否可以断点续传,如果可以
(1)文件没有改变,可以续传,则响应206表示部分传输,并且正文是部分文件数据
(2)文件改变,不能续传,则响应200表示这是新的下载,下载全部文件数据 并且服务器响应中,携带字段Content-Range:bytes 200-1000/78978 表示当前响应数据是那一部分数据(语法如图2)

图1: 客户端 Range头部信息

在这里插入图片描述

图2:服务端Content-Range信息

在这里插入图片描述

客户端与服务端的请求与响应图解:

在这里插入图片描述
在这里插入图片描述

获取文件 ETag 的函数:

GetIndentifer 函数作用:利用文件的**大小**和**文件最后一次修改时间**拼接起来返回拼接字符串;作为 ETag
static std::string GetIndentifer(const std::string& path) {    uint64_t mtime, fsize;    fsize = fs::file_size(path);    auto time_type = fs::last_write_time(path);    mtime = decltype(time_type)::clock::to_time_t(time_type);    std::stringstream ss;    ss << fsize << mtime ;    std::cout<<ss.str()<<"\n";    return ss.str();    
} 

下载文件(断点续传) 的函数:

Download 函数的作用(取Download中的断点续传部分):下载函数在页面展示之后,可以通过页面中文件显示点击下载;1.通过请求方法获取到文件名称;2.添加文件路径+文件名;3.调用GetIndentifer函数获取文件的ETag4.判断请求方法中是否有If-Range的头部字段;有则表示支持断点续传:5.判断请求方法中的 If-Range对应的ETag  与当前的ETag是否相同相同则表示文件没有发生改变;不相同表示文件发生改变,则从头下载;6.从请求方法获取需要续传的文件起始位置和结束位置。7.从文件中读取到相应位置的数据放入响应正文;8.设置头部信息,设置响应状态码为206 ,表示区间数据响应成功;
static void Download(const httplib::Request& req,httplib::Response& rsp){    std::cout<<"Download ......\n";std::string name=req.matches[1];std::string pathname=BACKUP_PATH+name;std::string newetag=GetIndentifer(pathname);uint64_t fsize=fs::file_size(pathname);if(req.has_header("If-Range")){std::string oldetag=req.get_header_value("If-Range");if(oldetag==newetag){//断点区间,获取数据范围std::cout<<req.ranges[0].first<<" - "<<req.ranges[0].second<<"\n";int64_t start=req.ranges[0].first;int64_t end=req.ranges[0].second;Util::RangeRead(pathname,&rsp.body,&start,&end);rsp.set_header("Content-Type","application/octet-stream");rsp.set_header("ETag",newetag);std::stringstream ss;ss<<"bytes "<<start<<"-"<<end<<"/"<<fsize;//   /后面跟文件大小,不知道大小可以写 *                                                                                   std::cout<<ss.str()<<std::endl;rsp.set_header("Content-Range",ss.str());rsp.status=206;return;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/39124.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

断点续传的原理

断点续传是大型文件数据传输的核心。本文将以多线程技术和Socket技术为依托&#xff0c;介绍大型文件断点续传的实现方法。  基本实现思想  多线程断点续传实现的基本思想就是在发送端&#xff08;也称客户端&#xff09;将要传输的文件分割为大小相当的多块&#xff0c;用…

wget 断点续传

wget是Linux系统中的一个下载工具&#xff0c;最近因为要下载一个比较大的数据集&#xff0c;直接使用浏览器下载每次断开后都会从头开始下载&#xff0c;而wget支持的断点续传功能则可以在已经下载的部分数据的基础上继续下载剩余数据。 &#xff08;1&#xff09;wget安装 …

如何实现文件断点续传功能

本文章首发于公众号攻城狮客栈&#xff0c;有需要的朋友可文末扫描二维码。 相信大家都使用过迅雷、电驴、百度云网盘等一类的工具&#xff0c;所有这些支持上传或下载的工具都有一个功能&#xff0c;那就是断点续传&#xff0c;也就是在你网络不佳传输断开时&#xff0c;传输会…

python 断点续传

python 断点续传 1.前序2.技术原理2.1 Content-Range2.2 Range 3. 代码实现 1.前序 当下载突然断开后&#xff0c;断点续传就需要了&#xff0c;继续前面下载的内容下载。解决了不需要重复下载 2.技术原理 HTTP/1.1 开始支持断点续传&#xff0c;一般断点下载会用到 Range 和…

web前端Tips:断点续传如何实现?

在Web前端中实现断点续传功能的一种常见方式是使用HTTP Range请求和文件分片上传。 以下是一个简单的断点续传实现的步骤&#xff1a; 前端将要上传的文件分成多个固定大小的片段&#xff08;chunk&#xff09;&#xff0c;例如每个片段的大小为1MB。当用户选择上传文件时&am…

前段实现文件的断点续传

早就听说过断点续传这种东西&#xff0c;前端也可以实现一下 断点续传在前端的实现主要依赖着HTML5的新特性&#xff0c;所以一般来说在老旧浏览器上支持度是不高的 本文通过断点续传的简单例子&#xff08;前端文件提交后端PHP文件接收&#xff09;&#xff0c;理解其大致的实…

Android开发——断点续传原理以及实现

0. 前言 在Android开发中&#xff0c;断点续传听起来挺容易&#xff0c;在下载一个文件时点击暂停任务暂停&#xff0c;点击开始会继续下载文件。但是真正实现起来知识点还是蛮多的&#xff0c;因此今天有时间实现了一下&#xff0c;并进行记录。本文原创&#xff0c;转载请注…

如何实现断点续传

断点续传是指在网络传输中&#xff0c;当传输过程中出现异常或者用户主动停止传输时&#xff0c;能够恢复传输过程&#xff0c;避免重新传输已经传输过的数据&#xff0c;提高传输效率。实现断点续传可以通过以下方式&#xff1a; HTTP协议支持的断点续传 在HTTP协议中&#xf…

【MQ学习笔记】RocketMQ知识分析与总结

RocketMQ 为什么使用mq&#xff1f;mq的作用&#xff1f;mq对你项目带来了什么&#xff1f;不选mq行不行&#xff1f; 异步&#xff0c;MQ能够以异步的方式对消息进行处理&#xff0c;能够大大提高了系统的响应以及吞吐量解耦&#xff0c;MQ双方只需要负责生产或消费信息即可…

销售数据分析方法、如何写好一个专题分析报告、Hive大数据知识体系教程、大数据分析平台总体架构方案……| 本周精华...

▲点击上方卡片关注我&#xff0c;回复“8”&#xff0c;加入数据分析领地&#xff0c;一起学习数据分析&#xff0c;持续更新数据分析学习路径相关资料~&#xff08;精彩数据观点、学习资料、数据课程分享、读书会、分享会等你一起来乘风破浪~&#xff09;回复“小飞象”&…

老杨刷完了23个跨年演讲,这6场最适合网工

晚上好&#xff0c;我是老杨。 放假放了一阵子&#xff0c;老杨闲着没事儿&#xff0c;一共刷了23个跨年演讲。 好的演讲&#xff0c;和一本好书一样&#xff0c;都是可以震荡灵魂的。 也知道最近大家都忙得很&#xff0c;这里推荐7个最值得一听的跨年演讲&#xff0c;贴心吧…

朱广权李佳琦直播掉线,1.2 亿人在线等

作者 | 胡巍巍 出品 | 程序人生&#xff08;ID&#xff1a;coder_life&#xff09; 原来央视爸爸也有掉线的时候。 4月6日晚间&#xff0c;“国民段子手”朱广权连麦李佳琦&#xff0c;给湖北做公益带货直播。 “小朱配琦”的神仙组合&#xff0c;让人大呼过瘾&#xff0c;该直…

“我让 AI 来处理我 24 小时的音频信息——这会是未来吗?”

整理 | 郑丽媛 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 这几年 AI 发展和进化的速度&#xff0c;几乎可以用三个字来形容&#xff1a;杀疯了。 AI 下棋、AI 编程、AI 作画、AI 写小说、AI 预测蛋白质结构……当 AI 逐渐融入我们的生活&#xff0c;你是否设…

抗住百万人直播、被联合国推荐,起底飞书技术演进之路!

你去公司上班了吗&#xff1f; 随着近期接连不断传来的好消息&#xff0c;上班族开始关心起这问题来。但许多企业在相关政策的号召下&#xff0c;仍采取远程办公的方式。据艾媒咨询的数据显示&#xff0c;今年春节期间中国远程办公企业规模超过 1800 万家&#xff0c;远程办公人…

听8位淘宝工程师聊聊他们眼中的元宇宙 | 1024特辑

我们是技术工作者&#xff0c;致力于思考和创新&#xff0c;用代码去解决生活中的问题&#xff0c;为消费者的快乐和幸福而努力。 今天是1024程序员节&#xff0c;我们邀请了8位不同岗位的淘宝工程师&#xff0c;聊了聊他们眼中的未来消费生活&#xff0c;他们眼中的元宇宙&…

数字人的新革命,BAT的“冲高”战场

配图来自Canva可画 ChatGPT横空出世&#xff0c;让人们看到了数字人的另一种可能&#xff0c;将ChatGPT与虚拟数字人融合&#xff0c;研发出更加智能化、拟人化的虚拟数字人成为数字人厂商的新命题、新方向。 2月份&#xff0c;岭南股份、风语筑、开普云等10多家公司&#xf…

数字化直播沟通

目录 前言 一、介绍数字化&#xff08;5-10分钟&#xff09; 主播提问&#xff08;王&#xff09;&#xff1a; 回答&#xff08;向&#xff09;&#xff1a; 什么是数字化&#xff1f; 好的&#xff0c;我们来看下一个问题&#xff1a;什么是数字化转型&#xff1f; 好的…

部署React项目到云服务器(步骤清晰)

部署React项目到云服务器 前言(下载相关软件)开始部署服务器以及域名购买实例远程连接 或 XShell 7 远程连接服务器XShell 7 连接云服务器操作使用FileZilla将 打包后的 build(可能你们那里打包是dist)文件塞到服务器文件夹感谢看到这里&#xff01;点个关注再走啊&#xff01;…

云服务安装配置git

搭建网站&#xff0c;我们有时候是直接从github拉取代码&#xff0c;这就要配置git。 云服务器搭建网站还需要一些其他的基础配置&#xff0c;前面我们已经讲到&#xff0c;未进行配置的可以参考之前的文章。 云服务基本配置&#xff1a;腾讯云服务器小白保姆级教程_大鹏bmfm…

【回答问题】ChatGPT上线了!写出coco数据集的图像分类训练和预测函数代码?

写出coco数据集的图像分类训练代码 好的,我会尽力写出图像分类训练代码。首先,你需要准备好 COCO 数据集的图像和标签,并将其转换成适合你模型使用的格式。其次,你需要选择一个图像分类模型,并定义好模型的结构。接下来,你可以使用 PyTorch 等深度学习框架来实现训练代码…