断点续传
HTTP头中一般断点下载时才用到Range和Content-Range
Range请求头当中使用 只有请求头中写了Range字段在响应端才会有Content-Range字段
Content-Range响应头当中使用
请求
***********************************
GET /test.rar HTTP/1.1
Connection: close
Host: 116.1.219.219
Range: bytes=0-100
***********************************
Range的范围决定服务器提供客户端多少资源(0-100 第一个字节-第一101个字节的数据)
Range头域可以请求实体的一个或者多个子范围,Range的值为0表示第一个字节,也就是Range计算字节数是从0开始的
不写Range 会默认从第1个字节开始到最后
bytes=0-499
bytes=500-999
bytes=-500 最后500个字节
bytes=500- 从500开始到最后
bytes=0-0,-1 第一个与最后一个字节
bytes=500-600,601-999
回应
***********************************
不写Range字段 服务器的正常响应码200 写Range 206
HTTP/1.1 206 OK
Content-Length: 801
Content-Type: application/octet-stream
Content-Location: http://www.onlinedown.net/hj_index.htm
Content-Range: bytes 0-100/2350
Last-Modified: Mon, 16 Feb 2009 16:10:12 GMT
Accept-Ranges: bytes
Server: Microsoft-IIS/6.0
Date: Wed, 18 Feb 2009 07:55:26 GMT
***********************************
流程:写文件
在didRece… 不断的写文件 追加写
发起请求前必须读取文件 上一次下了多少个字节(假设500个字节)
请求Range:bytes=500- 500读取
开始 暂停 按钮
断开网络连接 NSURLConnection * connection; [connection Cancel];
所有代理全部关闭 下次必须重新实例化请求 再次连接
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:nil];
// 写RANGE字段
[request addValue:@"bytes=%qu-“ forHTTPHeaderField:@"RANGE"];
NSURLConnection * connection = nil;
[connection cancel];
NSDictionary *dic = [[NSFileManager defaultManager] attributesOfItemAtPath:_filePath error:nil];
_curLen = [dic[NSFileSize] unsignedIntegerValue];
可以通过这个方法来获取文件的大小
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:…];
// 写RANGE字段
[request addValue:@"bytes=%qu-“ forHTTPHeaderField:@"RANGE"];
NSURLConnection * connection = …;
[connection cancel];
通过这个方法来实现断点续传
@interface NSURLResponse : NSObject <</SPAN>NSSecureCoding, NSCopying>
- (long long)expectedContentLength;
本次请求的资源总大小
断点续传就是剩下的部分的大小
多线程下载可以
用断点续传做
对于服务器对带宽做限制的时候 就可以用
asi提供了断点续传的功能
很好用 具体用法如下
request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://dl_dir.qq.com/qqfile/qq/QQforMac/QQ_V2.4.1.dmg"]];
request.delegate = self;
request.downloadProgressDelegate = self;
[request setDownloadDestinationPath:_filePath];
[request setTemporaryFileDownloadPath:[NSString stringWithFormat:@"%@_temp",_filePath]];
[request startAsynchronous];
[request cancelAuthentication];
遵守两个协议
@protocol ASIHTTPRequestDelegate <</SPAN>NSObject>
@protocol ASIProgressDelegate <</SPAN>NSObject>
常用代理方法:
- (void)setProgress:(float)newProgress;
进度的代理