大文件下载(暂停和恢复下载)
来源:互联网 发布:单片机at 编辑:程序博客网 时间:2024/04/29 14:40
//// ViewController.m// 大文件的下载/* 如果文件比较小,下载方式会比较多 直接用NSData的+ (id)dataWithContentsOfURL:(NSURL *)url; 利用NSURLConnection发送一个HTTP请求去下载 如果是下载图片,还可以利用SDWebImage框架 */#import "ViewController.h"@interface ViewController ()<NSURLConnectionDataDelegate>@property (weak, nonatomic) IBOutlet UIProgressView *progressView;- (IBAction)start:(UIButton*)button;//写数据的文件句柄@property(nonatomic,strong)NSFileHandle *writeHandle;//当前已下载的数据的长度@property(nonatomic,assign)long long currentLength;//完整文件的总长度@property(nonatomic,assign)long long totalLength;//连接对象@property(nonatomic,strong)NSURLConnection *conn;//是否正在下载@property(nonatomic,assign,getter=isDownloading)BOOL downloading;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad];}- (IBAction)start:(UIButton *)button{ if (self.isDownloading) { self.downloading = NO; [button setTitle:@"开始" forState:UIControlStateNormal]; [self.conn cancel]; self.conn = nil; }else{ self.downloading = YES; [button setTitle:@"暂停" forState:UIControlStateNormal]; NSURL *url = [NSURL URLWithString:@"https://localhost/resources/video.zip"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; //设置请求头 NSString *value = [NSString stringWithFormat:@"bytes=%lld-",self.currentLength]; [request setValue:value forHTTPHeaderField:@"Range"]; self.conn = [NSURLConnection connectionWithRequest:request delegate:self]; }}#pragma mark - NSURLConnectionDataDelegate/** * 当接受到服务器的响应的就会调用 */- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ //文件下载完毕 if (self.totalLength) return; //0.文件存储的路径 NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; NSString *filepath = [caches stringByAppendingPathComponent:@"video.zip"]; //1.创建一个空的文件到沙盒中 NSFileManager *mgr = [NSFileManager defaultManager]; [mgr createFileAtPath:filepath contents:nil attributes:nil]; //2.创建写数据的文件句柄 self.writeHandle = [NSFileHandle fileHandleForWritingAtPath:filepath]; //3.获取完整文件的长度 self.totalLength = response.expectedContentLength;}/** * 当接受到服务器返回的数据就会调用(可能会被调用多次,每次只会传递部分数据) */- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ //累计已下载的数据的长度 self.currentLength += data.length; //显示进度 double progress = (double)self.currentLength / self.totalLength; self.progressView.progress = progress; //移到到文件的尾部 [self.writeHandle seekToEndOfFile]; //从当前移动的位置开始写入数据 [self.writeHandle writeData:data];}/** * 当服务器的数据接受完毕后就会调用 */- (void)connectionDidFinishLoading:(NSURLConnection *)connection{ //清空属性值 self.currentLength = 0; self.totalLength = 0; //关闭连接(不再输入数据到文件中) [self.writeHandle closeFile]; self.writeHandle = nil;}/** * 请求失败的时候调用(请求超时、断网、没有网。一般都是客户端错误) */- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ }@end
0 0
- 大文件下载(暂停和恢复下载)
- C#中实现暂停下载文件和恢复下载文件
- 文件下载 暂停 恢复 重试 清除
- 跟踪和恢复大文件下载
- 跟踪和恢复大文件下载
- [iOS 多线程 & 网络 - 2.4] - 大文件下载 (边下边写/暂停恢复下载/压缩解压zip/多线程下载)
- iOS开发网络篇—文件下载(暂停和恢复)
- iOS开发网络篇—文件下载(四·暂停和恢复)
- iOS开发网络篇—文件下载(四·暂停和恢复)
- iOS开发网络篇—文件下载(暂停和恢复)
- iOS多线程与网络开发之大文件下载 (边下边写/暂停恢复下载/压缩解压zip/多线程下载)
- 在ASP.NET中跟踪和恢复大文件下载
- 在ASP.NET中跟踪和恢复大文件下载
- 在ASP.NET中跟踪和恢复大文件下载
- 在ASP.NET中跟踪和恢复大文件下载
- 在ASP.NET中跟踪和恢复大文件下载
- 在ASP.NET中跟踪和恢复大文件下载
- 在ASP.NET中跟踪和恢复大文件下载
- 理论: 图论(6): 单源赋值图最短路径
- 使用hive访问elasticsearch的数据
- 一起talk C栗子吧(第八十六回:C语言实例--使用信号进行进程间通信三)
- 第1章 Python简介
- leetcode之Bulb Switcher
- 大文件下载(暂停和恢复下载)
- c语言实现普通队列
- ural 1005
- 最佳运动员搭配问题
- MyEclipse无法自动提示JUnit导包问题
- 《C++ STL基础 及应用》笔记
- 回首2015,展望2016
- Eclipse常用快捷键
- 第一条:用静态工厂方法代替构造器