@interface AAAViewController ()<NSURLSessionDataDelegate>
/**
NSFileHandle 文件句柄
特点:在写数据的时候边写边移动位置
使用步骤:
1> 创建空的文件
2> 创建文件句柄指针 指向该文件
3> 当接收到数据的时候,使用该句柄来写数据
4> 当所有的数据写完,应该关闭句柄指针
*/
@property(nonatomic, strong)NSFileHandle *fileHandle;
@property(nonatomic, assign)long long totalSize;
@property(nonatomic, assign)long long currentSize;
@end
@implementation AAAViewController
-(void)download:(NSString *)urlStr{
// 1 创建URL
NSURL *url = [NSURL URLWithString:urlStr];
//2. 创建请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// POST 请求才设置
// //3. 设置请求的方式
// request.HTTPMethod = @"POST";
// //4. 设置请求体
// request.HTTPBody =data;
//5. 创建sesstion
NSURLSessionConfiguration *config = [[NSURLSessionConfiguration alloc] init];
NSURLSession *session = [NSURLSession sessionWithConfiguration:config
delegate:self
delegateQueue:[[NSOperationQueue alloc] init]];
//6. 创建下载任务
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request];
[dataTask resume];
}
#pragma mark- NSURLSessionDataDelegate
//1. 接收到响应头就会响应
-(void)URLSession:(NSURLSession *)session
dataTask:(NSURLSessionDataTask *)dataTask
didReceiveResponse:(NSURLResponse *)response
completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{
//1. 获取文件建议名称
NSString *suggestName = [response suggestedFilename]; // 文件建议的名称,URL 的最后一个节点
NSString *cachepath = @"usr/default/";
NSString *fullPath = [NSString stringWithFormat:@"%@/%@",cachepath,suggestName];
//创建一个空的文件
[[NSFileManager defaultManager] createFileAtPath:fullPath contents:nil attributes:nil];
//2. 创建文件句柄
self.fileHandle = [NSFileHandle fileHandleForWritingAtPath:fullPath];
//2. 获取下载文件总大小
self.totalSize = [response expectedContentLength];
/**
NSURLSessionResponseCancel // 取消请求
NSURLSessionResponseAllow // 接收数据
NSURLSessionResponseBecomeDownload //
NSURLSessionResponseBecomeStream //
*/
completionHandler(NSURLSessionResponseAllow);
}
//2. 接收到数据就会调用
-(void)URLSession:(NSURLSession *)session
dataTask:(NSURLSessionDataTask *)dataTask
didReceiveData:(NSData *)data{
// 不断的拼接服务器返回的数据
[self.fileHandle writeData:data];
self.currentSize += data.length;
CGFloat progress = 1.0 *self.currentSize / self.totalSize;
NSLog(@"当前下载进度: %f",progress);
}
//3. 下载完成或者是失败就会调用
-(void)URLSession:(NSURLSession *)session
task:(nonnull NSURLSessionTask *)task
didCompleteWithError:(nullable NSError *)error{
if (error == nil) {
// 得到请求的响应头信息
[self.fileHandle closeFile];
}
}
@end
网络编程(03)NSURLSessionDataTask大文件下载
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 在项目里遇到附件的下载和本地查看功能,附件有可能是word pdf 图片 Excel表格 甚至是ppt 有点变态吧...
- iOS开发中经常会用到文件的下载与上传功能,今天咱们来分享一下文件下载的思路。文件上传下篇再说。 文件下载分为小文...
- 一. iOS中发送HTTP请求的方案 在iOS中,我们常用发送HTTP请求的方案有苹果原生(自带)NSURLCon...