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.创建taskNSURLSessionDataTask *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
转载于:https://www.cnblogs.com/liugengqun/p/5140141.html
iOS网络-NSURLSessionDataTask大文件离线断点下载相关推荐
- Java实现FTP批量大文件上传下载
用Java实现FTP批量大文件上传下载 <iframe id="I0_1416224567509" style="margin: 0px; padding: 0px ...
- C# Socket服务端与客户端通信(包含大文件的断点传输)
步骤: 一.服务端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤: (1)建立一个Socket (2)接收 ...
- HTML5 批量大文件上传下载
前言 文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法,毕竟很少有人会忍受,当文件上 ...
- 浏览器 批量大文件上传下载
本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...
- java多线程下载文件(断点下载、进度展示、网速展示)
引言 多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销. 多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的. 一个线程可以创建和撤销另一个线程:同一个进程中的多个线程之间可 ...
- 音乐(文件)断点下载
这篇文章介绍音乐等文件的下载,支持断点续传. 我们需要创建两个类 HYDownLoader:音乐下载的主类,可以进行新建下载.暂停下载.取消下载等. HYFileTool:文件管理类,主要为HYDow ...
- python下载大文件-python requests 下载大文件不完整
目前我有一个脚本, 从帝联的 CDN 外链获取一下文件作为备份. 使用的是 Python 2.7.10 requests 2.8.1 目前碰到一个情况, 使用 requests 下载大文件的时候会出现 ...
- 快速传输大文件,怎么通过网络传大文件给对方(1G以上)
在生活和工作中,我们总是要发送一些比较大的文件给别人,或者在自己的设备之间.在互联网日益发达的今天,我们可以用什么方法通过互联网快速传输大文件,发送1G以上的文件? 一.使用QQ传 在电脑上打开QQ, ...
- python批量下载网页文件-超简单超详细python小文件、大文件、批量下载教程
按照不同的情况,python下载文件可以分为三种: 小文件下载 大文件下载 批量下载 python 小文件下载 流程:使用request.get请求链接,返回的内容放置到变量r中,然后将r写入到你想放 ...
最新文章
- Kotlin for Android
- kernel 自定义字符驱动 第一次实验
- 直播预告 | 小米人工智能部崔世起:小爱同学全双工技术实践
- docker+mysql创建用户名密码_docker构建私有仓库并设置仓库用户和密码
- 使控件大小随窗口变化
- PLSQL_PLSQL读和写XML文件方式(案例)
- 关于部分手机无法搜索到5G wifi信号的解决方法
- Nginx源码分析 - 基础数据结构篇 - hash表结构 ngx_hash.c(07)
- C#控制台应用程序执行结果一闪而过的解决方法
- 石家庄地铁售票系统进度(田智凯,高泽伟)
- 基于 SLS 构建 RDS 审计合规监控
- CRX 4 Chrome
- 什么是SOL注入攻击?Land攻击?Ping of Death攻击?Teardrop攻击?
- 2-Druid 系统框架
- [转载]别让用户发呆—设计中的防呆策略
- html字重怎么设置,CSS 字重 font-weight
- 安卓电子书格式_[技巧] 无敌的boss级电子书阅读app,全能高手就要一个打十个。...
- 爬取素材网的妹子图片
- python Django项目点击run或debug时出现Type ‘manage.py help <subcommand>‘ for help on a specific subcommand.
- 用正则表达式求非负整数 、匹配正整数、非正整数、负整数、整数、非负浮点数、正浮点数、非正浮点数、负浮点数、浮点数、有数字26个英文字母组成的字符串
热门文章
- Android应用程序消息处理机制(Looper、Handler)分析(2)
- Excel数字、文本混合列导入SQL Server出现的问题&解决办法
- SQLI DUMB SERIES-5
- codility上的问题 (22)
- python+selenium百度贴吧自动签到
- SpringMVC 处理multipart形式数据:java方式配置文件上传
- 整数展示分数和整形数的四则运算
- 在LinearLayout中嵌套RelativeLayout来设置Button的位置(xml文件)
- Python基础14-迭代器与生成器
- python字典{:4}_Python字典101:详细的视觉介绍