iOS 使用NSURLSession下载大文件

NSURLSession *session = [NSURLSession sharedSession];

// 可以不用像connection一样用代理监听, 直接会下载文件, 但是无法获得下载的进度

NSURLSessionDownloadTask *task =  [session

downloadTaskWithURL:[NSURL URLWithString:@""]

completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {

// 文件存储的真实路径

NSString *file = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];

// 剪切location的临时文件到真实路径

NSFileManager *mgr = [NSFileManager defaultManager];

[mgr moveItemAtURL:location toURL:[NSURL fileURLWithPath:file] error:nil];

}];

[task resume];

///////////////////////////////////////////////////////////////////////////////////////////////////////////

// 遵搜三种协议 ,但是 最基本的哪一个 协议的继承性

@interface ViewController ()<NSURLSessionDataDelegate>// 继承子类就相当于继承了父类协议

@end

//协议间的继承关系: <NSURLSessionDataDelegate>:<NSURLSessionTaskDelegate>:<NSURLSessionDelegate>

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

// NSURLSession *session = [NSURLSession sharedSession];

// session.delegate  = self; // 不能直接设置delegate是 readonly

// 只能一开始的时候创建其代理

NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[[NSOperationQueue alloc] init]];

// 父协议,但是可以传入子协议:nullable id <NSURLSessionDelegate>

NSURLSessionDownloadTask *task =  [session downloadTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@""]] completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {}];

[task resume];

}

// 代理方法

-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{

// 要启动,否则无法下载

completionHandler(NSURLSessionResponseAllow);// 允许 后再继续请求数

}

-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{

}

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{

}

时间: 2024-08-08 10:20:11

iOS 使用NSURLSession下载大文件的相关文章

下载大文件时OutofMemoryException

有一个大文件下载的问题,这两天查了一下,主要原因有两个: 发送的Get请求中,没有设置HttpCompletionOption这个参数,当下载大文件的时候,会等到response body中的数据全部加载完才开始下载.现在已经改成了HttpCompletionOption.ResponseHeadersRead,这样只要head加载完就可以开始下载 下载的时候使用FileStreamResult File(Stream fileStream, string contentType, string

在ASP.NET中支持断点续传下载大文件(ZT)

IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头. 一. 两个必要响应头Accept-Ranges.ETag         客户端每次提交下载请求时,服务端都要添加这两个响应头,以保证客户端和服务端将此下载识别为可以断点续传的下载: Accept-Ranges:告知下载客户端这是一个可以恢复续传的下载,存放本次下载的开始字节位置.文件的字节大小: ETag:保存文件的唯一标识(我在用的文件名+文件最后修改时间,以便续传请求时对文件进行

解除百度云浏览器端对下载大文件的限制

百度网盘对浏览器端下载大文件做了一些限制,当超过一定大小的文件必须使用百度云管家才可以下载,这给用户的使用带来了不便. [不看分析请直接拉到页底] 1. 百度网盘限速原理 当点击下载一个大文件的时候百度网盘会弹出这样一个提示框. 我们给下个断点,看看是什么代码创建了这个提示框. 然后再次点击下载一个大文件,我们发现断点已经断下来了. 可以看出这里是在把提示对话框显示出来,我们需要查看调用栈往上找找. 跳过一些jQuery的操作,我们看到了这样一个函数,继续往上找. 这个isPlatformWin

ASP.Net 下载大文件的实现 (转)

原文:http://www.cnblogs.com/luisliu/p/4253815.html 当我们的网站需要支持下载大文件时,如果不做控制可能会导致用户在访问下载页面时发生无响应,使得浏览器崩溃.可以参考如下代码来避免这个问题. 关于此代码的几点说明: 1. 将数据分成较小的部分,然后将其移动到输出流以供下载,从而获取这些数据. 2. 根据下载的文件类型来指定 Response.ContentType .(这个网址可以找到大部分文件类型的对照表:http://tool.oschina.ne

ASP.Net 下载大文件的实现

当我们的网站需要支持下载大文件时,如果不做控制可能会导致用户在访问下载页面时发生无响应,使得浏览器崩溃.可以参考如下代码来避免这个问题. 关于此代码的几点说明: 1. 将数据分成较小的部分,然后将其移动到输出流以供下载,从而获取这些数据. 2. 根据下载的文件类型来指定 Response.ContentType .(这个网址可以找到大部分文件类型的对照表:http://tool.oschina.net/commons) 3. 在每次写完response时记得调用 Response.Flush()

转(Response.WriteFile 无法下载大文件解决方法)

以前用Response.WriteFile(filename),但当遇到大文件时无法完整下载. 该方法最大的问题,它不是直接将数据抛到客户端,而是在服务器端(IIS)上缓存.当下载文件比较大时,服务器压力会很大,iis虽然支持2G大小的文件下载,但当文件上了很多M时,由于服务器以及网络等因素的影响,异常概率相当大.所以当需要下载大文件时就不能使用上面的方法了. 微软推荐以下方法代替之: ■将数据分成较小的部分,然后将其移动到输出流以供下载,从而获取这些数据. ■为用户提供用于下载文件的链接. ■

[libcurl]_[0基础]_[使用libcurl下载大文件]

场景: 1. 在Windows编程时, 下载http页面(html,xml)能够使用winhttp库,可是并非非常下载文件,由于会失败. 由此引出了WinINet库,无奈这个库的稳定性比較低,使用样例又少, 下载大文件时常常是不完整,可查找的资料非常少或者是没有特殊情况的解决的方法. 2. 我的原则是假设系统有自带的就用系统的,可是 WinINet 要掌握须要花不少时间. 时间因素考虑到了libcurl. 3. libcurl支持ftp,http等协议的文件读取,还能自己主动获取文件大小, 最重

[libcurl]_[初级]_[使用libcurl下载大文件]

场景: 1. 在Windows编程时, 下载http页面(html,xml)可以使用winhttp库,但是并不是很下载文件,因为会失败. 由此引出了WinINet库,无奈这个库的稳定性比较低,使用例子又少, 下载大文件时经常是不完整,可查找的资料很少或者是没有特殊情况的解决办法. 2. 我的原则是如果系统有自带的就用系统的,但是 WinINet 要掌握需要花不少时间. 时间因素考虑到了libcurl. 3. libcurl支持ftp,http等协议的文件读取,还能自动获取文件大小, 最重要的是不

datasnap 上传/下载大文件(本Demo以图传片文件为例)

datasnap 上传/下载大文件(本Demo以图传片文件为例) 作者:admin 来源: 日期:2011-8-17 11:44:51 人气:737 标签: QQ空间 新浪微博 腾讯微博 腾讯朋友 QQ收藏 百度空间 百度贴吧 更多0 好久没写技术文了 datasnap传大流. 完整代码,同时感谢叶兄传流的指点,(只公开十天) 附:下面代码,转载请注明出处 ::code 服务端: function TServerMethods1.DownLoadFile(AfileName: string):