iOS开发 大文件下载(支持断点下载)

网络连接不支持汉字,需要将 含有汉字的网址转UTF-8 编码,格式如下  

NSString *pathUrl = @"http://10.0.8.8/download/iOS各种理论知识.pdf";
    NSURL *url = [NSURL URLWithString:[pathUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

    // 默认就是GET请求
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

//

//  HMViewController.m
//  03-大文件下载
//
//  Created by apple on 14-6-27.
//  Copyright (c) 2014年 heima. All rights reserved.
//


#import "HMViewController.h"


@interface HMViewController ()
@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
/**
 *  写数据的文件句柄
 */
@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;


- (IBAction)start:(UIButton *)button;
@end


@implementation HMViewController


- (void)viewDidLoad
{
    [super viewDidLoad];
    
}


// 按钮文字: "开始", "暂停"
- (IBAction)start:(UIButton *)button { // self.currentLength == 200
    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:@"http://192.168.1.200:8080/MJServer/resources/jre.zip"];
        // 默认就是GET请求
        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 代理方法
/**
 *  1. 当接受到服务器的响应(连通了服务器)就会调用
 */
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
#warning 一定要判断
    if (self.totalLength) return;
    
    // 0.文件的存储路径
    NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    NSString *filepath = [caches stringByAppendingPathComponent:@"jre.zip"];
    
    // 1.创建一个空的文件到沙盒中
    NSFileManager *mgr = [NSFileManager defaultManager];
    // 刚创建完毕的大小是0字节
    [mgr createFileAtPath:filepath contents:nil attributes:nil];
    
    // 2.创建写数据的文件句柄
    self.writeHandle = [NSFileHandle fileHandleForWritingAtPath:filepath];
    
    // 3.获得完整文件的长度
    self.totalLength = response.expectedContentLength;
}


/**
 *  2. 当接受到服务器的数据就会调用(可能会被调用多次, 每次调用只会传递部分数据)
 */
- (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];
}


/**
 *  3. 当服务器的数据接受完毕后就会调用
 */
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"connectionDidFinishLoading----");
    
    // 清空属性值
    self.currentLength = 0;
    self.totalLength = 0;
    
    // 关闭连接(不再输入数据到文件中)
    [self.writeHandle closeFile];
    self.writeHandle = nil;
}


/**
 *  请求错误(失败)的时候调用(请求超时\断网\没有网, 一般指客户端错误)
 */
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    
}
@end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值