IOS文件分段下载

HTTP HEAD 生成方法

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)获取资源文件大小,用于端点续传或多线程下载

使用代码块来获取资源大小的方法

- (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);

}

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

- (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);

}];

}

分段Range代码实现

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);

分段下载文件

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)

将数据写入文件

// 打开缓存文件

NSFileHandle *fp = [NSFileHandle
fileHandleForWritingAtPath:self.cachePath];

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

if (!fp) {

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

} else {

// 移动到文件末尾

[fp seekToEndOfFile];

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

[fp writeData:data];

// 关闭文件句柄

[fp closeFile];

}

IOS文件分段下载,码迷,mamicode.com

时间: 2024-10-25 23:05:56

IOS文件分段下载的相关文章

【iOS开发-98】文件分段下载:@“HEAD“和[request setValue:range forHTTPHeaderField:@"Range"]

(1)文件下载,一般的下载可以直接下载.而针对视频或者下载软件等下载需要分段下载.以下就是模拟的分段下载,即利用request设置Range,这个Range就是一个"bytes=1-1024"之类规定请求或者说下载的范围. (2)利用NSFileHandle控制文件写入. (3)只请求头文件HEAD,可以获取信息而不下载文件. #import "ViewController.h" #define kSizePerTime 50000 @interface ViewC

仿IOS圆形下载进度条

/** * Created by C058 on 2016/5/25. */ public class MyHoriztalProgressBar extends ProgressBar { private static final int DEFAULT_REACH_COLOR = 0xff24F569; private static final int DEFAULT_UNREACH_COLOR = 0xffC0C0C0; private static final int DEFAULT_R

ios开发视频播放后台下载功能实现 :1,ios播放视频 ,包含基于AVPlayer播放器,2,实现下载,iOS后台下载(多任务同时下载,单任务下载,下载进度,下载百分比,文件大小,下载状态)(真机调试功能正常)

ABBPlayerKit ios开发视频播放后台下载功能实现 : 代码下载地址:https://github.com/niexiaobo/ABBPlayerKit github资料学习和下载地址:https://github.com/niexiaobo/ 实现功能 :播放视频 ,视频后台下载 (真机调试功能正常) 1.使用ZFPlayer播放视频(可以在线和本地播放,基于AVPlayer,调节音量和屏幕亮度) 2.使用 WHCNetWorkKit 实现下载,后台下载(多任务同时下载,单任务下载,

分享一个Cisco IOS的下载网站

大家都知道思科的IOS下载是需要权限的,普通注册个账户还不行,下面分享个网站,上面有分享各个版本的IOS下载,自己在初接触 Cisco Catalyst 3560G-24TS Switch 的时候找到的: http://sfree.ws/

iOS开发下载文件速度计算

当我们写下载界面的时候,需要向用户展示每秒下载多少KB,这个时候就需要计算速度.如下: 我用的是AFNetworking来做下载的,我们拿AFHTTPRequestOperation来举列,AFHTTPRequestOperation中有个方法: - (void)setDownloadProgressBlock:(void (^)(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead)

iOS 字体下载

iOS可以动态的为系统下载字体,这些字体都下载到了系统的目录下,并且可以被其他应用公用 来看下如何实现动态下载: // 创建下载字体请求描述的准备 NSMutableDictionary *attrs = [NSMutableDictionary dictionaryWithObjectsAndKeys:fontName, kCTFontNameAttribute, nil]; CTFontDescriptorRef desc = CTFontDescriptorCreateWithAttrib

IOS字体下载

结合书本与苹果官方给的例子后,总结下下载的方法. 苹果给我们提供了很多漂亮的字体,只是有些字体设备并没有内置,需要我们去下载才行. 系统提供给我们的字体名我们可以通过mac系统提供的字体册来查阅. 得到我们想要的字体后就可以在我们的设备上进行下载了.这里要说一下,设备字体下载后是所有应用都可以使用的,而且字体的目录并不是我们APP的目录,因此并不会增大我们应用所需的空间. 这里结合着苹果官方所给例子来简述一下(官方例子): 事例中给我们预定了几种字体来让我们下载 1 - (void)viewDi

iOS开发——下载器的功能基本实现

今天,做了一个下载器的Demo,即从本地配置的Apache服务器上,下载指定的文件.这次,我们下载服务器根目录下的html.mp4文件. 按照惯例,我们先创建一个URL对象和请求. NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/html.mp4"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; 这里有两点需要注意,第一,这个url的字符串是全英文的,如果

IOS断点下载

下载的一些用法 ①对于小文件,可以直接下载,无需断点下载等处理. 1 -(void)clickDownBtn{ 2 NSURL *url = [NSURL URLWithString:@"https://picjumbo.imgix.net/HNCK8461.jpg?q=40&w=1650&sharp=30"]; 3 if (self.imgView.image == nil) { 4 [self downLoad:url]; 5 } 6 } 7 8 //下载过程 9