大文件下载(暂停和恢复下载)

来源:互联网 发布:单片机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
原创粉丝点击