iOS开发之文件(分段)下载

1HTTP HEAD方法

?


1

2

3

4

5

6

7

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:kTimeout];

request.HTTPMethod = @"HEAD";

[NSURLConnection sendAsynchronousRequest:request queue:self.myQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

    NSLog(@"%@", response);

    NSLog(@"---------------");

    NSLog(@"%@", data);

}];

运行测试代码可以发现,HEAD方法只是返回资源信息,而不会返回数据体

应用场景:

(1) 获取资源Mimetype

(2) 获取资源文件大小,用于端点续传或多线程下载

2、使用块代码获取网络资源大小的方法

?


1

2

3

4

5

6

7

8

9

- (void)fileSizeWithURL:(NSURL *)url completion:(void (^)(long long contentLength))completion

{

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:kTimeout];

    request.HTTPMethod = @"HEAD";

    NSURLResponse *response = nil;

    [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:NULL];

    

    completion(response.expectedContentLength);

}

3确定每次下载数据包的伪代码实现

?


1

2

3

4

5

6

7

8

9

10

11

12

- (void)downloadFileWithURL:(NSURL *)url

{

    [self fileSizeWithURL:url completion:^(long long contentLength) {

        NSLog(@"文件总大小:%lld", contentLength);       

        // 根据大小下载文件

               while (contentLength > kDownloadBytes) {

            NSLog(@"每次下载长度:%lld", (long long)kDownloadBytes);

            contentLength -= kDownloadBytes;

        }

        NSLog(@"最后下载字节数:%lld", contentLength);

    }];

}

4HTTP Range的示例

n  通过设置Range可以指定每次从网路下载数据包的大小

n  Range示例

n  bytes=0-499               从0到499的头500个字节

n  bytes=500-999          从500到999的第二个500字节

n  bytes=500-                 从500字节以后的所有字节

n  bytes=-500                 最后500个字节

n  bytes=500-599,800-899      同时指定几个范围

n  Range小结

n  -   用于分隔

p 前面的数字表示起始字节数

p 后面的数组表示截止字节数,没有表示到末尾

n  用于分组,可以一次指定多个Range,不过很少用

5、分段Range代码实现

?


1

2

3

4

5

6

7

8

9

10

11

12

long long fromBytes = 0;

long long toBytes = 0;

while (contentLength > kDownloadBytes) {

    toBytes = fromBytes + kDownloadBytes - 1;

    NSString *range = [NSString stringWithFormat:@"bytes=%lld-%lld", fromBytes, toBytes];

    NSLog(@"range %@", range);

    fromBytes += kDownloadBytes;

    contentLength -= kDownloadBytes;

}

fromBytes = fromBytes + contentLength - 1;

NSString *range = [NSString stringWithFormat:@"bytes=%lld-%lld", fromBytes, toBytes];

NSLog(@"range %@", range);

6分段下载文件

?


1

2

3

4

5

6

7

8

9

/**NSURLRequestUseProtocolCachePolicy = 0 // 默认的缓存策略,内存缓存

 NSURLRequestReloadIgnoringLocalCacheData = 1// 忽略本地的内存缓存*/

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:kTimeout];

NSString *range = [NSString stringWithFormat:@"bytes=%lld-%lld", from, end];

[request setValue:range forHTTPHeaderField:@"Range"];

NSURLResponse *response = nil;

NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:NULL];

    

NSLog(@"%@-%@-%ld", range, response, (unsigned long)data.length);

提示:

如果GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是200(OK)

7、将数据写入文件

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

- (void)appendData:(NSData *)data

{

// 打开缓存文件

NSFileHandle *fp =

[NSFileHandle fileHandleForWritingAtPath:self.cachePath];

// 如果文件不存在,直接写入数据

if (!fp) {

    [data writeToFile:self.cachePath atomically:YES];

else {

    // 移动到文件末尾

    [fp seekToEndOfFile];

    // 将数据文件追加到文件末尾

    [fp writeData:data];

    // 关闭文件句柄

    [fp closeFile];

}

}

8检查文件大小

?


1

2

3

4

5

6

7

// 判断文件是否存在

if ([[NSFileManager defaultManager] fileExistsAtPath:self.cachePath]) {

    NSDictionary *dict = [[NSFileManager defaultManager] attributesOfItemAtPath:self.cachePath error:NULL];

    return [dict[NSFileSize] longLongValue];

else {

    return 0;

}

提示:由于数据是追加的,为了避免重复从网络下载文件,在下载之前

  1. 判断缓存路径中文件是否已经存在
  2. 如果存在检查文件大小
  3. 如果文件大小与网络资源大小一致,则不再下载
时间: 2016-05-10

iOS开发之文件(分段)下载的相关文章

界面-web程序开发中文件的下载

问题描述 web程序开发中文件的下载 在登录得主界面增加下载的链接,可以下载发布到服务器上的文件.使用的框架是spring,Struts2,ibatis. 解决方案 如果你不愿暴露文件存储路径,就用io流的方式,若果无所谓,直接把路径放在超链接上即可. 解决方案二: BufferedInputStream br = new BufferedInputStream(new FileInputStream(f)); byte[] buf = new byte[1024]; int len = 0;

iOS开发中文件的上传和下载功能的基本实现_IOS

文件的上传 说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代码. 主控制器的关键代码: 复制代码 代码如下: YYViewController.m #import "YYViewController.h" #define YYEncode(str) [str dataUsingEncoding:NSUTF8StringEncoding] @interface YYV

iOS开发PCH文件、NSLog真机不打印

添加PCH文件 现在Xcode6.7创建一个新的工程时将默认不会再带有PCH文件,需要手动添加PCH文件. 在Supporting Files目录下,选择 File > New > File > iOS > Other > PCH File 然后点击下一步进行命名,建议命名格式为项目名称-Prefix,如图Demo 创建的PCH文件与编译器Xcode进行连接:找到 Project > Build Settings > 搜索 "Prefix Header&

iOS开发网络篇—实现大文件的多线程断点下载_IOS

说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始,创建一个和要下载的文件大小相同的文件(如果要下载的文件为100M,那么就在沙盒中创建一个100M的文件,然后计算每一段的下载量,开启多条线程下载各段的数据,分别写入对应的文件部分). 项目中用到的主要类如下: 完成的实现代码如下: 主控制器中的代码: #import "YYViewController.h" #import

iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载

前言:iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载是在前篇iOS开发之网络编程--使用NSURLConnection实现大文件下载的基础上进行    断点续传的设置.关于iOS开发之网络编程--使用NSURLConnection实现大文件下载的细节这里当然就不会再累述的啦.   断点续传的原理:    每次在向服务器请求下载数据的同时,要告诉服务器从整个下载文件的数据流的某个还未下载的位置开始下载,然后服务器就返回从那个位置开始的数据流.    图片示意图:

iOS开发网络篇—大文件的多线程断点下载

iOS开发网络篇-多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始,创建一个和要下载的文件大小相同的文件(如果要下载的文件为100M,那么就在沙盒中创建一个100M的文件,然后计算每一段的下载量,开启多条线程下载各段的数据,分别写入对应的文件部分). 项目中用到的主要类如下: 完成的实现代码如下: 主控制器中的代码: 1 #import "YYViewControl

iOS开发ASIHttpRequest发送数据与下载数据

  发送数据 本文为大家介绍了iOS开发ASIHttpRequest发送数据的内容,其中包括设定request头,使用ASIFormDataRequest POST表单,PUT请求.自定义POST请求等等内容. 设定request头 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; [request addRequestHeader:@"Referer" value:@"http://www.drea

IOS开发之网络编程--文件压缩和解压缩

前言: QQ表情包就用到了解压缩,从网络下载的那么多表情文件格式并不是一个一个图片文件,而是多个图片压缩而成的表情压缩包.下面介绍的是iOS开发中会用到的压缩和解压缩的第三方框架的使用. 注意: 这个第三方框架代码文件夹是SSZipArchive,使用cocoapods搜索也是搜索SSZipArchive.但是如果你在github上直接搜索ZipArchive,搜到点赞数最多,维护频繁的ZipArchive库,然后下载代码,其实就是这个SSZipArchive. 第三方框架github网址:ht

iOS开发实用技巧—在手机浏览器头部弹出app应用下载提示

iOS开发实用技巧-在手机浏览器头部弹出app应用下载提示 本文介绍其简单使用: 第一步:在本地建立一个访问的服务端. 打开本地终端,在本地新建一个文件夹,在该文件夹中存放测试的html页面. 在终端输入一行代码:python -m SimpleHTTPServer ---第二步:配置环境 打开safari,偏好设置->勾选 "在菜单栏中显示开发菜单",如下图所示. 第三步:编写html文件 在测试文件appdown.html中编写的测试代码如下: `说明`444934666为对