服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS实现文件下载功能

iOS实现文件下载功能

2022-08-03 15:46意华 IOS

这篇文章主要为大家详细介绍了iOS实现文件下载功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了iOS实现文件下载的具体代码,供大家参考,具体内容如下

说明:

1).获取网络文件大小;

2).开启循环,计算每段position开始与结束位置,通过Range头字段按块获取文件数据流;

3).使用NSFileHandle追加方式将NSData文件数据写入本地文件。

1、用HEAD请求方式获取网络文件大小:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
 获取网络文件大小
 */
- (long long)getNetFileLen:(NSURL *)url{
    //1.创建request
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:10];
    //设置请求方式为HEAD, 只获取头信息
    request.HTTPMethod = @"HEAD";
    
    //2.定义用于接收网络数据的对象
    NSURLResponse *response = nil;
    
    //3.同步请求网络,将结果存入response
    [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:NULL];
    
    //返回文件大小
    return response.expectedContentLength;
}

2、开启异步线程,请求网络下载文件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/*
 下载文件
 */
- (void)downloadFile:(NSString *)urlStr done:(void (^)())done{
    
    //1.获取系统自带全局队列
    //并行队列,多个线程并发执行:DISPATCH_QUEUE_PRIORITY_DEFAULT
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    //2.异步执行
    dispatch_async(queue, ^{
        //创建url对象
        NSURL *url = [[NSURL alloc] initWithString:urlStr];
        NSLog(@"url: %@", urlStr);
        
        //获取本地已下载文件大小
        long long localFileLen = [self getLocalFileLen];
        NSLog(@"localFileLen : %lld", localFileLen);
        
        //获取网络文件大小
        long long netFileLen = [self getNetFileLen:url];
        NSLog(@"netFileLen : %lld", netFileLen);
        
        if(localFileLen == netFileLen){//一样表示存在了
            return;
        }
        
        //每次从服务端获取的文件数据大小
        long long itemSize = 1024 * 20;
        
        //一段数据的开始position位置
        long long startPos = 0;
        
        //一段数据的结尾position位置
        long long endPos = 0;
        
        while (startPos < netFileLen) {
            //计算结尾position
            endPos = startPos + itemSize - 1;
            
            //组装range字段,用于请求头
            NSString *range = [NSString stringWithFormat:@"Bytes=%lld-%lld", startPos, endPos];
            
            NSLog(@"range : %@", range);
            
            //重新计算下一段数据开始position
            startPos = startPos + itemSize;
            
            /*
             缓存策略
             NSURLRequestUseProtocolCachePolicy = 0, 默认,内存缓存
             NSURLRequestReloadIgnoringLocalCacheData = 1, 忽略本地内存缓存
             NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,
             NSURLRequestReturnCacheDataElseLoad = 2,
             NSURLRequestReturnCacheDataDontLoad = 3,
             */
            
            //(1)创建request
            NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10];
            
            //设置Range请求头
            [request setValue:range forHTTPHeaderField:@"Range"];
            
            //(2)定义用于接收网络信息的对象
            NSURLResponse *response = nil;
            
            //(3)同步请求网络
            NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:NULL];
            
            //(4)将数据写入文件
            [self appendFile:data];
        }
        
        //3.切回主线程
        dispatch_async(dispatch_get_main_queue(), ^{
            //调用完成方法
            done();
        });
        
    });
}

3、获取本地文件大小:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
/*
 获取本地文件大小
 */
- (long long)getLocalFileLen{
    //目录路径
    NSString *cacheDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    //文件路径
    NSString *filePath = [cacheDir stringByAppendingPathComponent:@"qq.dmg"];
    //获取本地文件NSDictionary信息
    NSDictionary *map = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:NULL];
    //获取本地文件大小,转为longlong类型
    return [map[NSFileSize] longLongValue];
}

4、将NSData数据追加写入文件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/*
 将NSData数据追加写入文件
 */
- (void)appendFile:(NSData *)data{
    //目录路径
    NSString *cacheDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    //文件路径
    NSString *filePath = [cacheDir stringByAppendingPathComponent:@"qq.dmg"];
    
    NSLog(@"filePath : %@", filePath);
    
    //创建文件操作类,NSFileHandle支持追加写入方式
    NSFileHandle *file = [NSFileHandle fileHandleForWritingAtPath:filePath];
    
    if(!file){//文件不存在时,直接覆盖方式写入
        [data writeToFile:filePath atomically:YES];
        return;
    }
    //跳到文件末尾
    [file seekToEndOfFile];
    
    //写数据
    [file writeData:data];
    
    //关闭文件流
    [file closeFile];
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/a526001650a/article/details/89284161

延伸 · 阅读

精彩推荐
  • IOSiOS应用中使用Auto Layout实现自定义cell及拖动回弹

    iOS应用中使用Auto Layout实现自定义cell及拖动回弹

    这篇文章主要介绍了iOS应用中使用Auto Layout实现自定义cell及拖动回弹的方法,自定义UITableViewCell并使用Auto Layout对其进行约束可以方便地针对多尺寸屏幕进行...

    JohnLui7182021-01-09
  • IOSIOS面试大全之常见算法

    IOS面试大全之常见算法

    之前看了很多面试题,感觉要不是不够就是过于冗余,于是我将网上的一些面试题进行了删减和分类,这篇文章先给大家分享一下IOS中的常见算法,有需要...

    iOS开发网4862021-01-27
  • IOSios开发中的容错处理示例详解

    ios开发中的容错处理示例详解

    最近发现还是有很多朋友在问类似解析时容错问题怎么解决,所以下面这篇文章主要给大家介绍了关于ios开发中的容错处理的相关资料,文中通过示例代码...

    coder小鹏5002021-04-26
  • IOSIOS实现简易版的QQ下拉列表

    IOS实现简易版的QQ下拉列表

    在我们日常开发中tableView是用的非常多的控件, 无论在新闻应用, 视频, 聊天应用中都广泛使用, 那么今天小编也分享一个用tableView实现的类似QQ界面的下拉列...

    iOS开发网11902021-01-23
  • IOS完整的iOS新浪微博分享功能开发

    完整的iOS新浪微博分享功能开发

    这篇文章主要为大家详细介绍了较为完整的iOS新浪微博分享功能开发的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们...

    young_for_your8492021-02-20
  • IOSObjective-C Json 实例详解

    Objective-C Json 实例详解

    这篇文章主要介绍了 Objective-C Json 实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握Object-C Json的使用,需要的朋友可以参考下...

    松阳7752021-04-02
  • IOSiOS实现图片六边形阴影效果

    iOS实现图片六边形阴影效果

    这篇文章给大家分享了如何利用iOS实现图片六边形阴影的效果,文中给出实现的示例代码,对大家的理解和学习很有帮助,有需要的可以参考借鉴,下面来...

    等风的旺旺9862021-01-31
  • IOSiOS中常见的几种加密方法总结

    iOS中常见的几种加密方法总结

    这篇文章主要给大家介绍了关于iOS中常见的几种加密方法,其中包括 base64加密、POST加密、Token值介绍、MD5加密--(信息-摘要算法) 哈希算法之一、时间戳密码...

    si1ence8002021-04-09