1.确定URL路径
NSURL *url = [NSURL URLWithString:@""];
2.根据URL创建请求对象
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
3.发送请求(代理方法实现下载文件)
[[NSURLConnection alooc] initWithRequest:request delegate:self];
4.实现代理方法(直接将文件写在沙盒里)
/** 沙盒地址 */
@property(nonatomic,strong) NSString fullPath;
/ 数据总大小 /
@property(nonatomic,assign) NSInteger totalSize;
/ 当前数据大小 /
@property(nonatomic,assign) NSInteger currentSize;
/ 文件句柄 **/
@property(nonatomic,strong) NSFileHandle *handle;
- 当接收到服务器响应时调用,response为响应头部
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
//1.获得文件总大小(本次请求的文件数据的总大小)
self.totalSize = response.expectedContentLength;
//2.写数据到沙盒(拼接文件全路径)
self.fullPath = [[NSSearchPathForDirectoriesInDomains(NSCacheDirector , NSUserDomainMask , YES) lastObject] stringByAppendingPathComponent:@"123.mp4"];
//3.创建一个空的文件
[[NSFileManager defaultManager] createFileAtPath:self.fulPath contents:nil attributes:nil];
//4.创建文件句柄(指针)
self.handle = [NSFileHandle fileHandleForWritingAtPath:self.fullPath];
}
- 接收到服务返回的数据时调用,多次调用,直至接受到全部数据,每次接受一部分数据,放入到data中
- (void)connection:(NSURLConnection *)connection didReceiveData:(nonnull NSData *)data{
//1.移动文件句柄到数据的结尾
[self.handle seekToEndOfFile];
//2.写数据
[self.handle writeData:data];
//3.获得进度
self.currentSize += data.length;
//进度
NSLog(@"%f" , 1.0 * self.currentSize / self.totalSize);
}
- 数据接收完成是调用
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
//1.关闭文件句柄
[self.handle closeFile];
self.handle = nil;
}
注意:用完文件句柄一定要关闭,否则程序会有问题
断点下载
- 有些时候我们下载的过程中想要暂停一下,恢复暂停之后继续下载
- 这种情况我们需要设置一下请求头,让他从我们下载结束的位置再次下载
- 只需要在设置代理发送请求之前设置一下请求头
- setValue:forHTTPHeaderField:方法传进去的是一个健值对,利用Range的属性进行设置(后面的),前面的range是我们获取再次下载的位置
- self.currentSize是当前文件的大小,也是我们下次开始下载的位置
NSString *range = [NSString stringWithFormat:@"bytes=%zd-" , self.currentSize];
[request setValue:range forHTTPHeaderField:@"Range"];
- 在再一次点击会来到的代理方法中进行判断,防止我们来到这个方法的时候再次创建空文件以及句柄
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
//进行判断
if (self.currentSize > 0){
return;
}
//1.获得文件总大小(本次请求的文件数据的总大小)
self.totalSize = response.expectedContentLength;
//2.写数据到沙盒
self.fullPath = [[NSSearchPathForDirectoriesInDomains(NSCacheDirector , NSUserDomainMask , YES) lastObject] stringByAppendingPathComponent:@"123.mp4"];
//3.创建一个空的文件
[[NSFileManager defaultManager] createFileAtPath:self.fulPath contents:nil attributes:nil];
//4.创建文件句柄(指针)
self.handle = [NSFileHandle fileHandleForWritingAtPath:self.fullPath];
}