断点续传的实现思路
1、每次一进来,先给总大小和已经下载的大小赋值,判断若不是从头下载,则显示进度条2、暂停的时候,取消请求,并用 NSUserDefaults记录下载的暂停位置(客户端记录)3、继续下载的时候,设置下载的起始位置http协议的请求头的设置:Range : bytes=0-499 表示头500个字节Range : bytes=500-999 表示第二个500字节Range : bytes=-500 表示最后500个字节Range : bytes=500- 表示500字节以后的范围Range : bytes=0-0,-1 第一个和最后一个字节4、续传写文件时,总是从文件末尾追加写文件
效果图
代码实现
—————————viewDidLoad方法NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];recevieTotal = [[userDefaults objectForKey:@"RecevieTotal" ] floatValue];total = [[userDefaults objectForKey:@"Total" ] floatValue];if (total > 0 ) {CGFloat progress = recevieTotal / total;_progressView.progress = progress;_progressLabel.text = [NSString stringWithFormat:@"%.2f%%" , progress * 100 ];}
—————————downLoad方法
if (!isDownload) {NSURL *url = [NSURL URLWithString:@"http://free2.macx.cn:8182/tools/other4/iStatMenus511b17.dmg" ];NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];if (recevieTotal > 0 ) {NSString *value = [NSString stringWithFormat:@"bytes=%d-" , (int )recevieTotal];[request setValue:value forHTTPHeaderField:@"Range" ];}_connection = [NSURLConnection connectionWithRequest:request delegate:self ];isDownload = YES ;NSString *urlStr = url.absoluteString ;NSString *fileName = [urlStr lastPathComponent];_filePath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/%@" , fileName];if (![[NSFileManager defaultManager] fileExistsAtPath:_filePath]) {[[NSFileManager defaultManager] createFileAtPath:_filePath contents:nil attributes:nil ];}}
—————————pause方法[_connection cancel];_connection = nil ;[self appendFileData:self .receiveData ];NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];[userDefaults setObject:@(recevieTotal) forKey:@"RecevieTotal" ];[userDefaults setObject:@(total) forKey:@"Total" ];[userDefaults synchronize];isDownload = NO ;
—————————接收响应的方法---- NSHTTPURLResponse响应self .receiveData = [[NSMutableData alloc] init];if (total == 0 ) {total = [[response.allHeaderFields objectForKey:@"Content-Length" ] floatValue];NSLog (@"total is %.2f" , total);}
—————————接收数据的方法----实时接收[self .receiveData appendData:data];recevieTotal += data.length ;double progress = recevieTotal / total;self .progressView .progress = progress;self .progressLabel .text = [NSString stringWithFormat:@"%.2f%%" , progress * 100 ];if (self .receiveData .length > 500 * 1000 ) {[self appendFileData:self .receiveData ];[self .receiveData setData:nil ];}
—————————接收完数据的方法if (self .receiveData .length < 500 * 1000 ) {[self appendFileData:self .receiveData ];[self .receiveData setData:nil ];}_progressLabel.text = @"下载完成" ;isDownload = NO ;
- (void)appendFileData:(NSData *)data
{if (data .length == 0) {return ;} //使用NSFileHandle 写文件,此文件必须已经创建,NSFileHangdle 不会创建文件NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:_filePath];//将数据插入到写入点[fileHandle seekToEndOfFile];[fileHandle writeData:data ]; //关闭文件,确保写入完成[fileHandle closeFile];
}