断点下载重点
- 利用HTTP请求头的Range属性,就可以实现从指定位置开始下载
- 表示头500个字节:Range: bytes=0-499
- 表示第二个500字节:Range: bytes=500-999
- 表示最后500个字节:Range: bytes=-500
- 表示500字节以后的范围:Range: bytes=500-
- (IBAction)btnClick:(UIButton *)sender {
// 1.切换按钮图片
sender.selected = !sender.selected;
// 2.判断是否是继续下载
if (sender.selected) {
// 继续下载
NSLog(@"继续下载");
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_02.mp4"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 只要设置HTTP请求头的Range属性, 就可以实现从指定位置开始下载
/*
表示头500个字节:Range: bytes=0-499
表示第二个500字节:Range: bytes=500-999
表示最后500个字节:Range: bytes=-500
表示500字节以后的范围:Range: bytes=500-
*/
NSString *range = [NSString stringWithFormat:@"bytes %zd-", self.currentLength];
[request setValue:range forHTTPHeaderField:@"Range"];
self.con = [NSURLConnection connectionWithRequest:request delegate:self];
}else
{
// 暂停
NSLog(@"暂停");
[self.con cancel];
}
}
大文件的下载
创建URL(NSURL)
-
创建请求(NSMutableURLRequest)
- 设置开始下载的位置
- 设置请求头中Range的值
发送请求(NSURLConnection)并设置代理
实现NSURLConnectionDataDelegate代理方法
代理方法:
-
接收到服务器响应的时候
- 可以获取要下载文件的信息(大小)
- 判断是否之前已经下载的有一部分了,如果没有就下载
- 创建一个空的文件勇于保存下载的数据(NSFileManager)
- 创建文件的路径
-
接收到服务器返回的数据
- 创建一个操作文件的句柄(NSFileHandle)
- 通过句柄可以设置每次接收到的数据写入的位置
[self.handle seekToEndOfFile];
- 利用句柄写入数据
[self.handle writeData:data];
- 可计算出当前接收到的数据的大小,得出下载比例
// 计算当前接收到得数据的总数 self.currentLength += data.length; // 计算下载比例 self.progressView.progress = 1.0 * self.currentLength/self.totalLength;
-
接收完毕
- 关闭句柄
- 清空指针
[self.handle closeFile]; self.handle = nil;
也可以接收到服务器响应的时候创建一个文件流(NSOutputStream)
// 创建一个输出流
/*
第一个参数: 告诉系统数据流需要输出到哪
第二个参数: 告诉系统如何输出, 如果传递YES, 代表着每次数据都是输出到上一次的屁股后面
*/
self.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:YES];
// 只要调用open方法, 就可以往指定的文件中输出数据
// 如果文件不存在就会自动创建一个
[self.outputStream open];
- 接收到服务器返回的数据的时候把数据写入流
/*
第一个参数: 传入需要写入的数据
第二个参数: 告诉系统写入的数据有多长
*/
[self.outputStream write:data.bytes maxLength:data.length];
[self.outstream close];
- 数据接收完毕后关闭流
[self.outputStream close];
self.outputStream = nil;