iOS开发网络编程之断点续传
在下载较大的文件的时候,一次不能下载完毕,这就需要用到断点续传,那么在IOS开发中该如何实现呢,下面跟着小编一起通过本文来学习下。
前言
网络下载是我们在项目中经常要用到的功能,如果是小文件的下载,比如图片和文字之类的,我们可以直接请求源地址,然后一次下载完毕。但是如果是下载较大的音频和视频文件,不可能一次下载完毕,用户可能下载一段时间,关闭程序,回家接着下载。这个时候,就需要实现断点续传的功能。让用户可以随时暂停下载,下次开始下载,还能接着上次的下载的进度。
今天我们来看看如何自己简单的封装一个断点续传的类,实现如下功能。
,同时可以获取下载的进度。
,可以获取文件存储的位置
,给出失败的原因
,下次开始下载,接着上次的进度继续下载
原理讲解
要实现断点续传的功能,通常都需要客户端记录下当前的下载进度,并在需要续传的时候通知服务端本次需要下载的内容片段。
(RFC2616)中定义了断点续传相关的HTTP头的Range和Content-Range字段,一个最简单的断点续传实现大概如下:
,已经下载了其中512K
,客户端请求续传,因此需要在HTTP头中申明本次需要续传的片段:Range:bytes=512000-这个头通知服务端从文件的512K位置开始传输文件
,从文件的512K位置开始传输,并且在HTTP头中增加:Content-Range:bytes 512000-/1024000并且此时服务端返回的HTTP状态码应该是206,而不是200。
难点说明
1. 客户端如何获取已经下载的文件字节数
客户端这边,我们需要记录下每次用户每次下载的文件大小,然后实现原理讲解中步骤1的功能。
那么如何记载呢?
其实我们可以直接获取指定路径下文件的大小,iOS已经提供了相关的功能,实现代码如下,
?
1 [[[NSFileManager defaultManager] attributesOfItemAtPath: FileStorePath error:nil][NSFileSize] integerValue]
上一步,我们获取了已经下载文件的字节数,这里我们需要获取被下载文件的总字节数,有了这两个值,我们就可以算出下载进度了。
那么如何获取呢?这里我们需要用到http 头部的conten-length字段,先来看看该字段的含义
Content-Length用于描述HTTP消息实体的传输长度the transfer-length of the message-body。在HTTP协议中,消息实体长度和消息实体的传输长度是有区别,比如说gzip压缩下,消息实体长度是压缩前的长度,消息实体的传输长度是gzip压缩后的长度。
简单点说,content-length表示被下载文件的字节数。
对比原理讲解的第三步,我们可以看到如果要计算出文件的总字节数,那么必须把已经下载的字节数加上 content-length。
我们需要把每个被下载文件的总字节数存储起来,这里我们选择使用pli
iOS开发网络编程之断点续传 来自淘豆网m.daumloan.com转载请标明出处.