ios HTTP 文件下载 进度条显示
2017-08-27 10:16
246 查看
这里使用的是
代码:
补充
在这个Demo中唯一的优点就是节约了内存,因为每一次写都写到了硬盘中去,而不是内存中,现在你们可以打开你们自己的
作者:LitterL
链接:http://www.jianshu.com/p/abca16c996a7
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
NSURLConnection的代理请求下载,并且是具有进度,UI能实时刷新,至于
NSURLConnection如何请求、并且有几种请求方法请看NSURLConnection请求简介,在这里的话我们以下载一本书籍为例,下面为它的地址(这是在百度云里面弄的,链接是别人加密了,所有比较长)
http://d.pcs.baidu.com/file/2b66fa1c93d8322d5299a1befc59b16c?fid=204559171-250528-1042286675318370&time=1453435914&rt=sh&sign=FDTAERV-DCb740ccc5511e5e8fedcff06b081203-X%2Bcz8N4IQb25c4wIKAyYl1HHW2M%3D&expires=8h&chkv=1&chkbd=0&chkpc=&dp-logid=498837374116132296&dp-callid=0&r=107651804
代码:
1、首先在storyboard里面拖入一个Progress View(进度条)控件 2、在控制器中拖入Progress View属性,并且另外添加三个属性,如下: @interface ViewController ()<NSURLConnectionDelegate> /** 进度条属性*/ @property (weak, nonatomic) IBOutlet UIProgressView *progressView; /** 文件总大小 */ @property (nonatomic, assign) NSUInteger totalLength; /** 文件当前大小 */ @property (nonatomic, assign) NSUInteger currentLength; /** 文件路径 */ @property (nonatomic, copy) NSString *path; @end 3、确定它的URL,以及请求,并且设置它的代理,然后发送所谓的代理请求 - (void)viewDidLoad { [super viewDidLoad]; //1、确定URL NSURL *url = [NSURL URLWithString:@"http://d.pcs.baidu.com/file/2b66fa1c93d8322d5299a1befc59b16c?fid=204559171-250528-1042286675318370&time=1453435914&rt=sh&sign=FDTAERV-DCb740ccc5511e5e8fedcff06b081203-X%2Bcz8N4IQb25c4wIKAyYl1HHW2M%3D&expires=8h&chkv=1&chkbd=0&chkpc=&dp-logid=498837374116132296&dp-callid=0&r=107651804"]; //2、创建请求对象 NSURLRequest *request = [NSURLRequest requestWithURL:url]; //3、代理请求 /* 第一个参数:请求对象 第二个参数:谁成为代理 第三个参数:startImmediately :是否立即开始发送网络请求 */ NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO]; [connection start]; } 4、在这个Demo中,代理有两个方法是很重要的 4.1、第一个就是刚开始响应的时候,在响应头中,我可以获取文件的预估大小和文件名后缀,用来创建文件夹和记录文件的总大小,用于后面的计算 4.2、第二个就是每次接受到服务器数据的时候,我可以往某个文件写数据,以及计算每次占比例的多少 //1.当接受到服务器响应的时候会调用:response(响应头) -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { NSLog(@"接受到响应"); //1、在响应头中有一个预估的文件大小expectedContentLength self.totalLength = response.expectedContentLength; //这里你们可以打印看看 然后在网页的请求头也可以去对比一下,看是否为一样 // NSLog(@"totalLength = %lld", response.expectedContentLength); //2、这里的话为了让性能好一点,我直接在沙盒的Caches中创建一个文件夹直接写的硬盘上,而不是内存中 //2.1、这里是地址为 在沙盒路径的Caches中 添加一个文件名为suggestedFilename的文件,suggestedFilename是响应头中的,也是百度云弄的名字你们也可以打印看看 // NSLog(@"%@",response.suggestedFilename); NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingString:response.suggestedFilename]; //2.2、拿到地址那我们开始创建一个空得文件夹,并且路径给外面的path属性,用于后面拿到位置下载 NSFileManager *manager = [NSFileManager defaultManager]; [manager createFileAtPath:path contents:nil attributes:nil]; self.path = path; } //2.当接受到服务器返回数据的时候调用(会调用多次) -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { // 1、创建一个操作文件的句柄,并且给予上次的创建文件夹的地址。 NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:self.path]; //设置写入方式,自上次后面写入 [handle seekToEndOfFile]; // 2、利用句柄往文件中写入数据 [handle writeData:data]; // 3、计算当前接收到得数据的总数 这里就是记录每一次写入数据的多少 self.currentLength += data.length; 4000 // 4、计算下载比例 self.progressView.progress = 1.0 * self.currentLength/self.totalLength; } //3.当请求失败的时候调用 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"请求失败"); } //4.当请求结束(成功|失败)的时候调用 -(void)connectionDidFinishLoading:(NSURLConnection *)connection { NSLog(@"请求结束"); }
补充
在这个Demo中唯一的优点就是节约了内存,因为每一次写都写到了硬盘中去,而不是内存中,现在你们可以打开你们自己的
沙盒里面应该会有一个PDF的文件也就是刚刚下载的,这个Demo中最重要的方法为:
//1.当接受到服务器响应的时候会调用:response(响应头) -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { } //2.当接受到服务器返回数据的时候调用(会调用多次) -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { }
作者:LitterL
链接:http://www.jianshu.com/p/abca16c996a7
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相关文章推荐
- ios 使用NSURlSession 下载文件并且使用进度条进行文件下载进度读取以及打开附件(word,excel,ppt,pdf)显示
- Python HTTP下载文件并显示下载进度条
- Android中带有进度条百分比显示的可以从网络下载文件的适配器【单线程模式】
- Http 下载文件 并显示进度条
- 基于NoHttp+RxBus+MVP实现网络文件下载(带进度条)
- Symbian中Http下载文件引擎,支持进度显示
- python实现socket上传下载文件-进度条显示
- iOS开发网络篇—文件下载(三·进度条)
- iOS开发网络篇—文件下载(三·进度条)
- ios使用AFN框架下载文件显示下载百分比带进度条
- Qt5.8用HTTP实现文件上传和下载(带进度条)
- linux c++下载http文件并显示进度<转>
- python实现socket上传下载文件-进度条显示
- 带有进度条的FinalHttp文件下载
- Android 下载文件 进度条显示
- WPF下载远程文件,并显示进度条和百分比
- Android 下载文件 进度条显示
- Android HTTP下载文件并显示
- 【CLI】使用 Curl 下载文件实时进度条显示
- 笔记5:利用HttpWebResponse下载文件,显示下载文件大小、网速、完成大小