iOS网络-NSURLSessionDataTask大文件离线断点下载

什么叫离线断点下载,就是用户下载中关闭程序重新打开可以继续下载

代码实现如下:

#import "ViewController.h"
@interface ViewController ()<NSURLSessionDataDelegate>
//输出流
@property (nonatomic, strong) NSOutputStream *stream ;
//Task对象
@property (nonatomic, strong) NSURLSessionDataTask *dataTask;
//文件总大小
@property (nonatomic, assign) NSInteger totalSize;
//文件当前已下载大小
@property (nonatomic, assign) NSInteger currentSize;
//文件的全路径
@property (nonatomic, strong) NSString *fullPath
//会话对象
@property (nonatomic, strong) NSURLSession *session;
@end

@implementation ViewController
//懒加载会话对象
-(NSURLSession *)session
{
    if (_session == nil) {
        //3.创建会话对象
        /*
         第一个参数:配置信息
         第二个参数:代理  self
         第三个参数:代理方法的队列
         */
        NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
        _session = session;
    }
    return _session;
}
//懒加载task
-(NSURLSessionDataTask *)dataTask
{
    if (_dataTask == nil) {

        //1.确定请求路径
        NSString *urlStr = @"http://120.25.226.186:32812/resources/videos/minion_01.mp4";
        NSURL *url = [NSURL URLWithString:urlStr];

        //2.创建请求对象
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

        NSString *fileName = [urlStr lastPathComponent];
        NSInteger curentSize = [self getCurrentLength:fileName];
                 //记录当前已下载的大小
        self.currentSize = curentSize;
        //设置请求头,表示下一次下载从哪个地方开始下载
        NSString *range = [NSString stringWithFormat:@"bytes=%zd-",curentSize];
        [request setValue:range forHTTPHeaderField:@"Range"];

        //4.创建task
        NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:request];

        _dataTask = dataTask;

    }
    return _dataTask;
}

-(void)dealloc
{
    //释放session 俩种方法任选一种
    [self.session invalidateAndCancel];
//    [self.session resetWithCompletionHandler:nil];
}

//开始下载
- (IBAction)startBtnClick:(id)sender
{
    [self.dataTask resume];
}
//暂停下载
- (IBAction)suspendBtnClick:(id)sender
{
    [self.dataTask suspend];
}
//继续下载
- (IBAction)goOnBtnClick:(id)sender
{
    [self.dataTask resume];
}
//得到当前下载进度
-(NSInteger)getCurrentLength:(NSString *)fileName
{
    self.fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:fileName];

    NSDictionary *dict = [[NSFileManager defaultManager] attributesOfItemAtPath:self.fullPath error:nil];
    NSLog(@"%@",dict);
    //获取文件已下载大小
    NSInteger size = [dict[@"NSFileSize"] integerValue];
    return size;
}
#pragma mark - NSURLSessionDataDelegate
//1.接收到服务器响应的时候
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
    //expectedContentLength:本次请求的数据的大小
    self.totalSize = response.expectedContentLength + self.currentSize;

    //创建输出流
    NSOutputStream *stream = [[NSOutputStream alloc]initToFileAtPath:self.fullPath append:YES];

    //打开流
    [stream open];
    self.stream = stream;

    //通过该回调告诉系统是否要继续接收服务器返回给我们的数据NSURLSessionResponseAllow==接收
    completionHandler(NSURLSessionResponseAllow);
}
//2.接收到服务器返回数据的时候调用,会调用多次
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
    NSLog(@"didReceiveData---%zd",data.length);

    [self.stream write:data.bytes maxLength:data.length];

    self.currentSize +=data.length;
   //打印下载进度
    NSLog(@"%f",1.0 * self.currentSize / self.totalSize);
}

//3.请求结束的时候调用(成功|失败),如果失败那么error有值
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
    NSLog(@"didCompleteWithError---%@",[NSThread currentThread]);

  //关闭流
    [self.stream close];
    self.stream = nil;
}
@end
时间: 2024-08-11 09:56:04

iOS网络-NSURLSessionDataTask大文件离线断点下载的相关文章

使用NSURLSessionDataTask实现大文件离线断点下载(完整)

6.1 涉及知识点 (1)关于NSOutputStream的使用 //1. 创建一个输入流,数据追加到文件的屁股上 //把数据写入到指定的文件地址,如果当前文件不存在,则会自动创建 NSOutputStream *stream = [[NSOutputStream alloc]initWithURL:[NSURL fileURLWithPath:[self fullPath]] append:YES]; //2. 打开流 [stream open]; //3. 写入流数据 [stream wri

ios开发网络学习十一:NSURLSessionDataTask离线断点下载(断点续传)

#import "ViewController.h" #define FileName @"121212.mp4" @interface ViewController ()<NSURLSessionDataDelegate> @property (weak, nonatomic) IBOutlet UIProgressView *proessView; /** 接受响应体信息 */ @property (nonatomic, strong) NSFile

ios:NSURLSessionDataTask做文件断点下载

之前用afn2.x的AFHttpOperation结合sqlite数据库管理做了文件的断点下载功能,之后苹果宣布要开始限制ipv4,不过AFN的东西时给予high-level的APIs的,因此不需要修改,但是国外的开发者建议使用AFN3.0版本. 闲来无事就想重新集成一下,迁移AFN3.0的时候因为没有了HTTPOperation,所以在修改代码的时候全部用NSURLSessionDowonloadTask代替,不过由于之前的数据库逻辑已经定型,且多处使用,修改起来比较复杂,DownloadTa

C# Socket服务端与客户端通信(包含大文件的断点传输)

步骤: 一.服务端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤:   (1)建立一个Socket   (2)接收信息   (3)发送数据(这里分发送字符串.文件(包含大文件).震动) 二.客户端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤:   (1)建立一个Socket   (2)接收信息   (3)发送数据(这里分发送

iOS开发网络篇—大文件的多线程断点下载(转)

http://www.cnblogs.com/wendingding/p/3947550.html iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始,创建一个和要下载的文件大小相同的文件(如果要下载的文件为100M,那么就在沙盒中创建一个100M的文件,然后计算每一段的下载量,开启多条线程下载各段的数据,分别写入对应的文件部分). 项目中用到的主要

iOS开发网络请求——大文件的多线程断点下载

iOS开发中网络请求技术已经是移动app必备技术,而网络中文件传输就是其中重点了.网络文件传输对移动客户端而言主要分为文件的上传和下载.作为开发者从技术角度会将文件分为小文件和大文件.小文件因为文件大小比较小导致传输所需时间少传输就快,因此不太容易影响用户体验,可用的技术就多.而大文件因为文件大小比较大导致传输时间长,因此就需要考虑到各种用户体验,比如避免在上传下载文件过程中阻塞主线程影响用户体验,就需要使用到多线程技术:为了给用户友好的进度提示,因此又需要开发中跟踪数据上传和下载数据的变化:为

iOS开发网络篇—大文件的多线程断点下载

iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始,创建一个和要下载的文件大小相同的文件(如果要下载的文件为100M,那么就在沙盒中创建一个100M的文件,然后计算每一段的下载量,开启多条线程下载各段的数据,分别写入对应的文件部分). 项目中用到的主要类如下: 完成的实现代码如下: 主控制器中的代码: 1 #import "YYViewControl

封装了okhttp的网络框架,支持大文件上传下载,上传进度...

本帖最后由 anjoy紫外线 于 2016-4-20 16:42 编辑   1.用法 对于Eclipse不能运行项目的,提供了apk供直接运行,位于项目根目录 okhttputils_v1.x.x.apk. 本项目Demo的网络请求是我自己的服务器,有时候可能不稳定,网速比较慢时请耐心等待.. 对于Android Studio的用户,可以选择添加: compile 'com.lzy.net:okhttputils:1.3.0'  //可以单独使用,不需要依赖下方的扩展包    compile'c

[转]用C#如何实现大文件的断点上传

最近做在做一个项目,涉及到文件上传的问题. 以前也做过文件上传.但都是些小文件,不超过2m. 这次要求上传1g以上的东西. 没办法找来资料研究了一下. 基于web的文件上传可以使用ftp和http两种协议,用ftp的话虽然传输稳定,但安全性是个严重的问题,所以没有考虑. 剩下只有http. 在http中有3种方式,put.webdav.rfc1867,前2种方法不适合大文件上传,在这里也不说了. 确定使用rfc1867格式处理之后开始分析流行的上传组件.看了n多代码之后发现,目前无组件程序和一些