断点下载

断点下载重点

  • 利用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;

你可能感兴趣的:(断点下载)