IOS 断点续传原理浅析
来源:互联网 发布:sas软件价格 编辑:程序博客网 时间:2024/05/06 11:56
本文转自:http://www.jianshu.com/p/de263da8cdb0
断点续传概述:
断点续传就是从文件上次中断的地方开始重新下载或上传数据,当下载大文件的时候,如果没有实现断点续传功能,那么每次出现异常或者用户主动的暂停,都会去重头下载,这样很浪费时间。所以断点续传的功能就应运而生了
在说IOS断点续传之前,下面来简单介绍 HTTP 断点续传的原理
其实断点续传的原理很简单,就是在Http的请求上和一般的下载有所不同而已,举个例子吧!
1.浏览器请求服务器上的一个文件名为test.zip时,请求内容只展示了一些与本文有关的信息
GET /test.zip HTTP/1.1Accept-Language: zh-cnAccept-Encoding: gzip, deflateConnection: Keep-Alive
2.服务器收到请求后,按要求寻找请求的文件,提取文件的信息,然后返回给浏览器,返回信息如下:
200Content-Length=66667777Accept-Ranges=bytesContent-Type=application/octet-stream
为了实现从文件已经下载的地方开始继续下载。所以在客户端传给服务器的时候要多加一条信息--从哪里开始。下面是客户端请求时的请求信息,要求从44445555字节开始。
1
GET /test.zip HTTP/1.0User-Agent: NetFoxRANGE: bytes=44445555-
上面的请求信息多了一个新的字段RANGE RANGE:bytes=44445555-
这段话的意思就是告诉服务器test.zip这个文件从44445555字节开始传,前面的字节不用传了。服务器收到这个请求以后,返回的信息如下:
206Content-Length=66667777Content-Range=bytes 44445555-66667777Content-Type=application/octet-stream
和第一次服务器返回的信息相比,增加了一行:
Content-Range=bytes 44445555-66667777
返回的代码也改为206了,而不再是200了。
知道了以上原理,就可以进行断点续传的编程了。
IOS断点续传原理
要实现断点续传 , 服务器必须支持(这个很重要,一个巴掌是拍不响的,如果服务器不支持,那么客户端写的再好也没用)。
// 1 指定下载文件地址 URLString // 2 获取保存的文件路径 filePath // 3 创建 NSURLRequest NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:URLString]]; unsigned long long downloadedBytes = 0; if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) { // 3.1 若之前下载过 , 则在 HTTP 请求头部加入 Range // 获取已下载文件的 size downloadedBytes = [self fileSizeForPath:filePath]; // 验证是否下载过文件 if (downloadedBytes > 0) { // 若下载过 , 断点续传的时候修改 HTTP 头部部分的 Range NSMutableURLRequest *mutableURLRequest = [request mutableCopy]; NSString *requestRange = [NSString stringWithFormat:@"bytes=%llu-", downloadedBytes]; [mutableURLRequest setValue:requestRange forHTTPHeaderField:@"Range"]; request = mutableURLRequest; } } // 4 创建 AFHTTPRequestOperation AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; // 5 设置操作输出流 , 保存在第 2 步的文件中 operation.outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:YES]; // 6 设置下载进度处理 block [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) { // bytesRead 当前读取的字节数 // totalBytesRead 读取的总字节数 , 包含断点续传之前的 // totalBytesExpectedToRead 文件总大小 }]; // 7 设置 success 和 failure 处理 block [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { } failure:^(AFHTTPRequestOperation *operation, NSError *error) { }]; // 8 启动 operation [operation start];
使用以上代码 , 断点续传功能就实现了
总结:
断点续传主要依赖于 HTTP 头部定义的 Range 来完成。有了 Range,应用可以通过 HTTP 请求获取失败的资源,从而来恢复下载该资源。当然并不是所有的服务器都支持 Range,但大多数服务器是可以的。Range 是以字节计算的,请求的时候不必给出结尾字节数,因为请求方并不一定知道资源的大小。
今天只是简单的介绍了一下,关于断点续传其实不止这点知识!下次有时间的话继续写,希望各位多多提些意见!多谢!
- IOS 断点续传原理浅析
- iOS- 断点续传实现原理
- iOS push原理浅析
- iOS开发之断点续传原理与实现
- 断点续传原理
- 断点续传原理
- 断点续传原理
- 断点续传原理
- 断点续传原理
- IOS 断点续传
- iOS 断点续传
- 断点续传-iOS
- IOS 断点续传
- IOS断点续传
- iOS-------------断点续传
- ios-断点续传
- iOS断点续传
- iOS断点续传
- 摘自w3school的html标签内容——表单标签(2)
- Android积累--常用小知识点
- [LeetCode] 24. Swap Nodes in Pairs java
- iOS 启动图片会影响控制器的启动大小
- 批处理set /a举例推荐
- IOS 断点续传原理浅析
- 微服务理论与实践(六)-服务注册与发现
- mysql触发器简单总结
- [LeetCode] 25. Reverse Nodes in k-Group java
- elasticsearch-rtf
- 数三退一代码实现
- iOS开发之银联支付
- POI_EXCEL
- 播放器音视频同步及网络抖动解决方案