网络通信中关于请求数据、断点续传和写入本地文件-创新互联

- (void)viewDidLoad {

创新互联公司-专业网站定制、快速模板网站建设、高性价比水城网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式水城网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖水城地区。费用合理售后完善,十载实体公司更值得信赖。

  [super viewDidLoad];

  NSLog(@"%@",NSHomeDirectory());

  //取得已下载数据大小

  NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

  receiveTotal = [[userDefaults objectForKey:@"ReceiveTotal"] doubleValue];

  total = [[userDefaults objectForKey:@"Total"] doubleValue];

  //显示上一次下载的进度

  if (total > 0) {

    CGFloat progress = receiveTotal/total;

    self.progressView.progress = progress;

    self.progressLabel.text = [NSString stringWithFormat:@"%.2f%%", progress * 100];

  }

}

- (IBAction)downLoadClick:(UIButton *)sender {

  if (!isDownLoad) {

    //1.构建URL

    NSURL *url = [NSURL URLWithString:@"http://s.qdcdn.com/lovebizhi/LoveWallpaper4Mac.dmg"];

    //2.构建Request

    NSMutableURLRequest *mRequest = [NSMutableURLRequest requestWithURL:url];

    //断点续传

    if (receiveTotal > 0) {

      //设置续传位置

      NSString *position = [NSString stringWithFormat:@"bytes=%d-",(int)receiveTotal];

      [mRequest setValue:position forHTTPHeaderField:@"Range"];

    }

    //3.发送异步请求

    connection = [NSURLConnection connectionWithRequest:mRequest delegate:self];

    isDownLoad = YES;

    //获取字符串

    NSString *urlStr = url.absoluteString;

    //获取urlStr的最后一部分

    NSString *fileName = [urlStr lastPathComponent];

    //写入文件

    filePath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/%@",fileName];

    //创建文件

    [[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];

  }

}

//暂停下载

- (IBAction)pauseClick:(UIButton *)sender {

  //取消下载连接

  [connection cancel];

  connection = nil;

  //将缓冲数据写入文件

  [self appendFileData:self.receiveData];

  //在本地保存已下载文件的大小和文件总大小

  NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

  [userDefaults setObject:@(receiveTotal) forKey:@"ReceiveTotal"];

  [userDefaults setObject:@(total) forKey:@"Total"];

  //将数据同步写入文件

  [userDefaults synchronize];

  isDownLoad = NO;

}

#pragma mark-NSURLConnectionDataDelegate

//服务器响应

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSHTTPURLResponse *)response{

  self.receiveData = [[NSMutableData alloc]init];

  //判断总大小是否为0,如果为0,说明从起始位置开始下,获取文件总大小

  if (total == 0) {

    //获取所有的响应头

    NSDictionary *fields = response.allHeaderFields;

    NSLog(@"fields is %@",fields);

    //获取数据的总大小

    NSNumber *length = [fields objectForKey:@"Content-Length"];

    total = [length doubleValue];

    NSLog(@"total is %.2f",total);

  }

}

//接收数据

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{

  [self.receiveData appendData:data];

  receiveTotal += data.length;

  //计算进度

  double progress = receiveTotal / total;

  //刷新UI

  self.progressView.progress = progress;

  self.progressLabel.text = [NSString stringWithFormat:@"%.2f%%",progress * 100];

  //判断缓冲的数据是否大于500KB

  if (self.receiveData.length >= 500 * 1024) {

    //写入数据

    [self appendFileData:self.receiveData];

    //清空

    self.receiveData.data = nil;

  }

}

//数据传输完成

- (void)connectionDidFinishLoading:(NSURLConnection *)connection{

  //将最后一个缓冲文件写入

  if (self.receiveData.length < 500 * 1024) {

    //写入数据

    [self appendFileData:self.receiveData];

    //清空

    self.receiveData.data = nil;

  }

  _progressLabel.text = @"下载完成";

  self.progressView.progress = 0;

  isDownLoad = NO;

}

- (void)appendFileData:(NSData *)data{

  if (data.length == 0) {

    return;

  }

  //使用NSFileHandle写文件,此文件必须已经创建,NSFileHandle不会创建文件

  NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:filePath];

  //将数据插入到写入点

  [fileHandle seekToEndOfFile];

  [fileHandle writeData:data];

  //关闭文件,确保写入完成

  [fileHandle closeFile];

}

- (void)didReceiveMemoryWarning {

  [super didReceiveMemoryWarning];

  // Dispose of any resources that can be recreated.

}

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


本文标题:网络通信中关于请求数据、断点续传和写入本地文件-创新互联
文章位置:http://pwwzsj.com/article/cocjih.html