24>文件下载
2015-05-19 20:01
162 查看
一、大文件下载
1.方案:利用NSURLConnection和它的代理方法
1> 发送一个请求
2> 在代理方法中处理服务器返回的数据
2.注意点:千万不能用NSMutableData来拼接服务器返回的数据
3.大文件下载代码:
二、NSURLConnection发送异步请求的方法
1.block形式 - 除开大文件下载以外的操作,都可以用这种形式
2.代理形式 - 一般用在大文件下载
三、NSURLSession
1.使用步骤
1> 获得NSURLSession对象
2> 利用NSURLSession对象创建对应的任务(Task)
3> 开始任务([task resume])
2.获得NSURLSession对象
1> [NSURLSession sharedSession]
2>
3.任务类型
1> NSURLSessionDataTask
* 用途:用于非文件下载的GET\POST请求
2> NSURLSessionDownloadTask
* 用途:用于文件下载(小文件、大文件)
1.方案:利用NSURLConnection和它的代理方法
1> 发送一个请求
// 1.URL NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/resources/videos.zip"]; // 2.请求 NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 3.下载(创建完conn对象后,会自动发起一个异步请求) [NSURLConnection connectionWithRequest:request delegate:self];
2> 在代理方法中处理服务器返回的数据
/** 在接收到服务器的响应时: 1.创建一个空的文件 2.用一个句柄对象关联这个空的文件,目的是:方便后面用句柄对象往文件后面写数据 */ - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { // 文件路径 NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; NSString *filepath = [caches stringByAppendingPathComponent:@"videos.zip"]; // 创建一个空的文件 到 沙盒中 NSFileManager *mgr = [NSFileManager defaultManager]; [mgr createFileAtPath:filepath contents:nil attributes:nil]; // 创建一个用来写数据的文件句柄 self.writeHandle = [NSFileHandle fileHandleForWritingAtPath:filepath]; } /** 在接收到服务器返回的文件数据时,利用句柄对象往文件的最后面追加数据 */ - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { // 移动到文件的最后面 [self.writeHandle seekToEndOfFile]; // 将数据写入沙盒 [self.writeHandle writeData:data]; } /** 在所有数据接收完毕时,关闭句柄对象 */ - (void)connectionDidFinishLoading:(NSURLConnection *)connection { // 关闭文件 [self.writeHandle closeFile]; self.writeHandle = nil; }
2.注意点:千万不能用NSMutableData来拼接服务器返回的数据
3.大文件下载代码:
// // ViewController.m // 03-大文件的下载 // // Created by 张旗 on 15/5/19. // Copyright (c) 2015年 张旗. All rights reserved. // #import "ViewController.h" @interface ViewController ()<NSURLConnectionDataDelegate> /** * 用来操作文件的文件句柄对象 */ @property (nonatomic,strong) NSFileHandle *writeHandle; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/resources/videos/BagFile.zip"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [NSURLConnection connectionWithRequest:request delegate:self]; } #pragma -mark - /** * 请求失败时调用(请求超时、网络异常) * @param error 错误原因 */ - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { } /** * 接收到服务器响应时调用 * * @param response 响应 */ - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { // 文件路径 NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; NSString *filepath = [caches stringByAppendingPathComponent:@"BagFile.zip"]; NSLog(@"%@",filepath); // 在沙盒中创建一个跟服务器端的文件一样大小的空间 NSFileManager *mgr = [NSFileManager defaultManager]; [mgr createFileAtPath:filepath contents:nil attributes:nil]; // 实例化写数据的文件句柄 self.writeHandle = [NSFileHandle fileHandleForWritingAtPath:filepath]; } /** * 当接受到服务器返回的实体数据时调用(返回具体内容,该方法被调用多次) * * @param data 这次返回的数据 */ - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { // 移动文件到最后面 [self.writeHandle seekToEndOfFile]; // 将数据写入沙盒 [self.writeHandle writeData:data]; } /** * 加载完毕后调用(服务器数据已经完全返回) * * @param connection <#connection description#> */ - (void)connectionDidFinishLoading:(NSURLConnection *)connection { // 关闭Handle,即关闭管道 [self.writeHandle closeFile]; self.writeHandle = nil; } @end
二、NSURLConnection发送异步请求的方法
1.block形式 - 除开大文件下载以外的操作,都可以用这种形式
[NSURLConnection sendAsynchronousRequest:<#(NSURLRequest *)#> queue:<#(NSOperationQueue *)#> completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { }];
2.代理形式 - 一般用在大文件下载
// 1.URL NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/login?username=123&pwd=123"]; // 2.请求 NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 3.下载(创建完conn对象后,会自动发起一个异步请求) [NSURLConnection connectionWithRequest:request delegate:self];
三、NSURLSession
1.使用步骤
1> 获得NSURLSession对象
2> 利用NSURLSession对象创建对应的任务(Task)
3> 开始任务([task resume])
2.获得NSURLSession对象
1> [NSURLSession sharedSession]
2>
NSURLSessionConfiguration *cfg = [NSURLSessionConfiguration defaultSessionConfiguration]; self.session = [NSURLSession sessionWithConfiguration:cfg delegate:self delegateQueue:[NSOperationQueue mainQueue]];
3.任务类型
1> NSURLSessionDataTask
* 用途:用于非文件下载的GET\POST请求
NSURLSessionDataTask *task = [self.session dataTaskWithRequest:request]; NSURLSessionDataTask *task = [self.session dataTaskWithURL:url]; NSURLSessionDataTask *task = [self.session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { }];
2> NSURLSessionDownloadTask
* 用途:用于文件下载(小文件、大文件)
NSURLSessionDownloadTask *task = [self.session downloadTaskWithRequest:request]; NSURLSessionDownloadTask *task = [self.session downloadTaskWithURL:url]; NSURLSessionDownloadTask *task = [self.session downloadTaskWithURL:url completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) { }];
相关文章推荐
- 用<a>标签下载文件
- <二代测序> 下载 NCBI sra 文件
- 为什么下载文件文件名太长就会被截取,但是用<a href="">就不会有文件名超长的问题?!
- struts2文件下载 <result type="stream">
- 文件的上传与下载--->张国亮总结心得第一季
- struts2文件下载及 <param name="inputName">inputStream</param>的理解
- spring mvc 实现任意文件上传—— 下载<二>
- struts2文件下载及 <param name="inputName">inputStream</param>的理解
- struts2文件下载及 <param name="inputName">inputStream</param>的理解
- 文件下载:"Content-disposition","attachment; filename=中文名>>>解决方案
- 网站上有一个mp3文件,但是用<a href="my.mp3">下载</a>时,会在播放器里打开,请问我要怎样才能实现点击后下载呢?
- ant从URLs(例如nexus)下载文件<get>标签
- struts2文件下载 <result type="stream">
- Control Study->AdRotator广告控件显示自定义配置文件中广告以及与DataGrid控件结合使用显示图片(示例代码下载)
- Control Study->AdRotator广告控件显示自定义配置文件中广告以及与DataGrid控件结合使用显示图片(示例代码下载)
- 文件的上传与下载--->张国亮总结心得第二季
- strut2下载文件的“ <param name="inputName"> tag specified for this action.”异常
- python-&gt;FTP上传下载文件
- 文件下载:"Content-disposition","attachment; filename=中文名>>>解决方案
- <二代测序> 批量下载 NCBI sra 文件