IOS断点续传

#import "ViewController.h"

@interface ViewController ()<NSURLConnectionDataDelegate,NSURLConnectionDelegate>
{
    NSURL *_url;
    NSURLConnection *_connection;
    //文件读写
    NSFileHandle *_fileHandle;
    //下载文件保存路径
    NSString *_filePath;
    //文件真实大小
    long long _expectSize;
    //已经下载的大小
    long long _readSize;
}
@property (weak, nonatomic) IBOutlet UILabel *progressLabel;
@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
@property (weak, nonatomic) IBOutlet UIButton *startBtn;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"%@",NSHomeDirectory());
//    NSLog(@"%@",[NSURL URLWithString:[@"http://127.0.0.1/掌厨项目.zip" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]);
    _url = [NSURL URLWithString:[@"http://127.0.0.1/1.zip" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
}

- (IBAction)download:(UIButton *)sender {
    if ([sender.titleLabel.text isEqualToString:@"开始下载"]) {
        [sender setTitle:@"暂停" forState:UIControlStateNormal];

        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:_url];

        NSString *range = [NSString stringWithFormat:@"bytes=%lld-",_readSize];

        [request setValue:range forHTTPHeaderField:@"range"];

        _connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
    }
    else
    {
        [sender setTitle:@"开始下载" forState:UIControlStateNormal];
        [_connection cancel];
    }
}

#pragma mark - ConnectionDelegate
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"%@",error.localizedDescription);
}

//接收到服务端响应
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    if (!_expectSize) {
        //获取文件真实大小
        _expectSize = response.expectedContentLength;
        _filePath = [NSHomeDirectory() stringByAppendingString:@"/Library/Caches/1.zip"];
        NSFileManager *manager = [NSFileManager defaultManager];
        [manager createFileAtPath:_filePath contents:nil attributes:nil];
        _fileHandle = [NSFileHandle fileHandleForUpdatingAtPath:_filePath];
    }
}

//接收到服务端数据(数据量大时,会调用多次)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    //获取到已经下载的大小
    _readSize += data.length;
//    data writeToFile:<#(NSString *)#> atomically:<#(BOOL)#>
    [_fileHandle seekToEndOfFile];
    [_fileHandle writeData:data];

    CGFloat ratio = 1.0*_readSize/_expectSize;
    _progressLabel.text = [NSString stringWithFormat:@"%.f%%",ratio*100];
    _progressView.progress = ratio;
}

//下载完成
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"下载完成!");
    [_fileHandle closeFile];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
时间: 2024-12-29 16:02:15

IOS断点续传的相关文章

iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载+使用输出流代替文件句柄

前言:本篇讲解,在前篇iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载的基础上,使用输出流代替文件句柄实现大文件断点续传.    在实际开发中,输入输出流用的比较少,但是用起来也是很方便的.iOS开发用到的输入输出流和在Java中的输入输出流是几乎一样的,本质也是一个意思:将网络返回的数据当做流来处理.    输入输出的理解:输入到哪里?输出到哪里?这个问题不难理解,输入输出是要站着服务器角度来思考的,下面用图来解释:    代码关键词: 1.在接收到响应头的代理

ios网络学习------11 原生API文件上传之断点续传思路

#import "MainViewController.h" @interface MainViewController () @end @implementation MainViewController - (void)viewDidLoad { [super viewDidLoad]; //下载文件 [self download]; } -(void)download { //1. NSURL NSURL *url = [NSURL URLWithString:@"ht

总结iOS开发中的断点续传那些事儿

前言 断点续传概述 断点续传就是从文件赏赐中断的地方重新开始下载或者上传数据,而不是从头文件开始.当下载大文件的时候,如果没有实现断点续传功能,那么每次出现异常或者用户主动的暂停,都会从头下载,这样很浪费时间有木有.所以呢,项目中实现大文件下载的时候,断点续传功能是必不可少了.当然咯,断点续传有一种特殊的情况,就是我们的应用呗用户kill掉或者应用crash,要实现应用重启之后的断点续传,这种情况就是我们将要解决的问题. 断点续传的原理 要实现断点续传,服务器必须是要支持的.目前最常见的两种方式

ios 实现断点续传 一 nsurlconnection

NSUrlConnection实现断点续传的关键是自定义http request的头部的range域属性. Range头域 Range头域可以请求实体的一个或者多个子范围.例如, 表示头500个字节:bytes=0-499 表示第二个500字节:bytes=500-999 表示最后500个字节:bytes=-500 表示500字节以后的范围:bytes=500- 第一个和最后一个字节:bytes=0-0,-1 同时指定几个范围:bytes=500-600,601-999 但是服务器可以忽略此请求

IOS开发网络篇之──ASIHTTPRequest下载示例(支持断点续传)

IOS开发网络篇之──ASIHTTPRequest下载示例(支持断点续传) 网络ios文件管理器attributespathurl 在工程中,我们会常常遇到需要下载的程序,比如下载在线音乐.下载图片等等,今天我将介绍一下利用ASIHTTPRequest的下载示例,支持断点续传,利用ASIHTTPRequest下载以及断点续传的原理在我的博客:http://blog.csdn.net/pjk1129/article/details/6575588中有具体的介绍,今天重点介绍如何实现,废话少说,开始

IOS Http断点续传浅析

下载LOFTER客户端IOS Http断点续传浅析 http实现断点续传的关键地方就是在httprequest中加入“Range”头. //设置Range头,值:bytes=x-y;x:开始字节,y:结束字节,不指定则为文件末尾[request addValue:@"bytes=500-" forHTTPHeaderField:@"Range"]; 如果服务器正确响应的话,就可以顺利续传:如果服务器不支持,那就只能用其它方法了. 经过测试,服务器的不支持分为两种情况

iOS 应用开发中的断点续传实践总结

断点续传概述 断点续传就是从文件上次中断的地方开始重新下载或上传数据,而不是从文件开头.(本文的断点续传仅涉及下载,上传不在讨论之内)当下载大文件的时候,如果没有实现断点续传功能,那么每次出现异常或者用户主动的暂停,都会去重头下载,这样很浪费时间.所以项目中要实现大文件下载,断点续传功能就必不可少了.当然,断点续传有一种特殊的情况,就是 iOS 应用被用户 kill 掉或者应用 crash,要实现应用重启之后的断点续传.这种特殊情况是本文要解决的问题. 断点续传原理 要实现断点续传 , 服务器必

IOS开发之网络编程(请求数据和断点续传)

IOS开发中网络编程应用场景:JSON数据获取,网络数据的下载. 一:请求JSON数据一般用异步请求的方式,如果用同步请求,则会造成IOS界面的执行过程阻塞,即界面部分在请求数据的过程中必须等待数据加载完毕. JSON数据的获取步骤: 1.设置网络地址的字符串:NSString *URLString = @"http://www.baidu.com"; 2.创建URL:NSURL *URL = [NSURL URLWithString:URLString]; 3.创建请求:NSURLR

iOS经验1:自己写的网络数据请求 第三方框架 断点续传 上传下载

镔哥哥做项目,一般的数据请求不管他多复杂,只要自己写好了请求,那么调用永远是那么的简单,那么我介绍一下 一:需要用到第三方框架AFNetworking,直接写在工程pch头文件里就行因为经常用到它,这在网上随便下载就行,最好用cocopod来下载,这样什么都有了,cocopod是什么,我就不说,博客上面有介绍. 开始啦: 1:自定义网络请求DataRequestManager类专门管理网络用的 朋友们以下代码就可以直接复制来用了 .h文件 //  DataRequestManager.h //