美文网首页
iOS-16 断点续传 下载

iOS-16 断点续传 下载

作者: leesen | 来源:发表于2019-08-12 01:33 被阅读0次

断点续传概述:

断点续传就是从文件上次中断的地方开始重新下载或上传数据,当下载大文件的时候,如果没有实现断点续传功能,那么每次出现异常或者用户主动的暂停,都会去重头下载,这样很浪费时间。所以断点续传的功能就应运而生了

在说IOS断点续传之前,下面来简单介绍 HTTP 断点续传的原理

其实断点续传的原理很简单,就是在Http的请求上和一般的下载有所不同而已,举个例子吧!

1.浏览器请求服务器上的一个文件名为test.zip时,请求内容只展示了一些与本文有关的信息

GET /test.zip HTTP/1.1

Accept-Language: zh-cn

Accept-Encoding: gzip, deflate

Connection: Keep-Alive

2.服务器收到请求后,按要求寻找请求的文件,提取文件的信息,然后返回给浏览器,返回信息如下:

200

Content-Length=66667777

Accept-Ranges=bytes

Content-Type=application/octet-stream

为了实现从文件已经下载的地方开始继续下载。所以在客户端传给服务器的时候要多加一条信息--从哪里开始。下面是客户端请求时的请求信息,要求从44445555字节开始。

1

GET /test.zip HTTP/1.0

User-Agent: NetFox

RANGE: bytes=44445555-

上面的请求信息多了一个新的字段RANGERANGE:bytes=44445555-

这段话的意思就是告诉服务器test.zip这个文件从44445555字节开始传,前面的字节不用传了。服务器收到这个请求以后,返回的信息如下:

206

Content-Length=66667777

Content-Range=bytes 44445555-66667777

Content-Type=application/octet-stream

和第一次服务器返回的信息相比,增加了一行:

Content-Range=bytes 44445555-66667777

返回的代码也改为206了,而不再是200了。

知道了以上原理,就可以进行断点续传的编程了。

IOS断点续传原理

要实现断点续传 ,服务器必须支持(这个很重要,一个巴掌是拍不响的,如果服务器不支持,那么客户端写的再好也没用)

// 1 指定下载文件地址 URLString// 2 获取保存的文件路径 filePath// 3 创建 NSURLRequestNSURLRequest*request = [NSURLRequestrequestWithURL:[NSURLURLWithString:URLString]];unsignedlonglongdownloadedBytes =0;if([[NSFileManagerdefaultManager] fileExistsAtPath:filePath]) {// 3.1 若之前下载过 , 则在 HTTP 请求头部加入 Range// 获取已下载文件的 sizedownloadedBytes = [selffileSizeForPath:filePath];// 验证是否下载过文件if(downloadedBytes >0) {// 若下载过 , 断点续传的时候修改 HTTP 头部部分的 RangeNSMutableURLRequest*mutableURLRequest = [request mutableCopy];NSString*requestRange =    [NSStringstringWithFormat:@"bytes=%llu-", downloadedBytes];    [mutableURLRequest setValue:requestRange forHTTPHeaderField:@"Range"];    request = mutableURLRequest;  } }// 4 创建 AFHTTPRequestOperationAFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];// 5 设置操作输出流 , 保存在第 2 步的文件中operation.outputStream = [NSOutputStreamoutputStreamToFileAtPath:filePath append:YES];// 6 设置下载进度处理 block[operation setDownloadProgressBlock:^(NSUIntegerbytesRead,longlongtotalBytesRead,longlongtotalBytesExpectedToRead) {// bytesRead 当前读取的字节数// totalBytesRead 读取的总字节数 , 包含断点续传之前的// totalBytesExpectedToRead 文件总大小}];// 7 设置 success 和 failure 处理 block[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation,idresponseObject) {  } failure:^(AFHTTPRequestOperation *operation,NSError*error) {  }];// 8 启动 operation[operation start];

使用以上代码 , 断点续传功能就实现了

总结:

断点续传主要依赖于 HTTP 头部定义的 Range 来完成。有了 Range,应用可以通过 HTTP 请求获取失败的资源,从而来恢复下载该资源。当然并不是所有的服务器都支持 Range,但大多数服务器是可以的。Range 是以字节计算的,请求的时候不必给出结尾字节数,因为请求方并不一定知道资源的大小。

今天只是简单的介绍了一下,关于断点续传其实不止这点知识!下次有时间的话继续写,希望各位多多提些意见!多谢!

链接:IOS 断点续传原理浅析

相关文章

  • iOS-16 断点续传 下载

    断点续传概述: 断点续传就是从文件上次中断的地方开始重新下载或上传数据,当下载大文件的时候,如果没有实现断点续传功...

  • Android下载文件(一)下载进度&断点续传

    索引 Android下载文件(一)下载进度&断点续传 Android下载文件(二)多线程并发&断点续传(待续) A...

  • Okhttp多线程断点续传

    目录 1、断点续传相关定义2、多线程下载实现方案 1、断点续传相关定义 1.1、断点续传: 记录上次下载的位置,下...

  • NSURLSession实现断点下载

    断点续传概述 断点续传就是从文件上次中断的地方开始重新下载或上传数据,而不是从文件开头。(本文的断点续传仅涉及下载...

  • IOS 断点续传原理浅析(第一篇)

    断点续传概述: 断点续传就是从文件上次中断的地方开始重新下载或上传数据,当下载大文件的时候,如果没有实现断点续传功...

  • 2019-08-19

    视频断点续传与下载

  • android 中断点续传

    android 中断点续传 单线程断点续传 所谓的断点续传就是在下载一个文件时,文件没有完全下载,中途暂停,那么再...

  • iOS断点续传

    基于iOS10、realm封装的下载器(支持存储读取、断点续传、后台下载、杀死APP重启后的断点续传等功能)。下载...

  • 造轮子 - RxDownload

    基于RxJava打造的下载工具, 支持多线程下载和断点续传, 智能判断是否支持断点续传等功能 标签(空格分隔): ...

  • Android-单线程断点续传

    断点续传的原理 看上一篇Android-断点续传 下面的例子是下载的断点续传,断点续传很简单就两点:1.网络请求的...

网友评论

      本文标题:iOS-16 断点续传 下载

      本文链接:https://www.haomeiwen.com/subject/dknejctx.html