前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS断点续传

iOS断点续传

作者头像
赵哥窟
发布2019-05-10 18:07:24
1.6K0
发布2019-05-10 18:07:24
举报
文章被收录于专栏:日常技术分享日常技术分享

此篇文章只讲解思路和原理

在项目中可能会用到较大的文件下载,比如较大的音频和视频文件,不可能一次下载完毕,用户可能下载一段时间,关闭程序,再次打开程序接着下载。这个时候,就需要实现断点续传的功能。让用户可以随时暂停下载,下次开始下载,还能接着上次的下载的进度。

原理讲解

要实现断点续传的功能,通常都需要客户端记录下当前的下载进度,并在需要续传的时候通知服务端本次需要下载的内容片段。

在HTTP1.1协议(RFC2616)中定义了断点续传相关的HTTP头的Range和Content-Range字段,一个最简单的断点续传实现大概如下:

客户端下载一个1024K的文件,已经下载了其中512K 网络中断,客户端请求续传,因此需要在HTTP头中申明本次需要续传的片段: Range:bytes=512000- 这个头通知服务端从文件的512K位置开始传输文件 服务端收到断点续传请求,从文件的512K位置开始传输,并且在HTTP头中增加: Content-Range:bytes 512000-/1024000 并且此时服务端返回的HTTP状态码应该是206,而不是200。

实现难点
1. 客户端如何获取已经下载的文件字节数

客户端需要记录每次用户下载的文件大小。

那么如何记载呢?

其实我们可以直接获取指定路径下文件的大小,iOS已经提供了相关的功能,实现代码如下

代码语言:javascript
复制
[[[NSFileManager defaultManager] attributesOfItemAtPath: FileStorePath error:nil][NSFileSize] integerValue]
2.如何获取被下载文件的总字节数

难点1我们获取了已经下载文件的字节数,这里我们需要获取被下载文件的总字节数,有了这两个值,我们就可以算出下载进度了。

如何获取文件总字节数?

这里我们需要用到http 头部的conten-length字段,先来看看该字段的含义

Content-Length用于描述HTTP消息实体的传输长度the transfer-length of the message-body。在HTTP协议中,消息实体长度和消息实体的传输长度是有区别,比如说gzip压缩下,消息实体长度是压缩前的长度,消息实体的传输长度是gzip压缩后的长度。

content-length表示被下载文件的字节数。 如果要计算出文件的总字节数,那么必须把已经下载的字节数 加上 content-length。 我们需要把每个被下载文件的总字节数存储起来,这里我们可以选择使用NSUserDefaults来记载。设置文件名为键值,已经下载的文件字节数为值。 文件名为了防止重复,这里我们设置文件名为下载url的hash值,可以保证不重重。

至此断点续传原理就说完了。具体实现可以去看一些开源代码。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.04.28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原理讲解
  • 实现难点
    • 1. 客户端如何获取已经下载的文件字节数
      • 那么如何记载呢?
      • 2.如何获取被下载文件的总字节数
        • 如何获取文件总字节数?
        相关产品与服务
        对象存储
        对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档