1. #import "ViewController.h"
  2.  
  3. @interface ViewController ()<NSURLConnectionDataDelegate>
  4. @property (weak, nonatomic) IBOutlet UIProgressView *progressView;
  5.  
  6. @property (nonatomic, assign) NSInteger totalSize;
  7. @property (nonatomic, assign) NSInteger currentSize;
  8. /** 文件句柄*/
  9. @property (nonatomic, strong)NSFileHandle *handle;
  10. /** 沙盒路径 */
  11. @property (nonatomic, strong) NSString *fullPath;
  12. /** 连接对象 */
  13. @property (nonatomic, strong) NSURLConnection *connect;
  14. @end
  15.  
  16. @implementation ViewController
  17.  
  18. - (IBAction)startBtnClick:(id)sender {
  19. [self download];
  20. }
  21. - (IBAction)cancelBtnClick:(id)sender {
  22. [self.connect cancel];
  23. }
  24. - (IBAction)goOnBtnClick:(id)sender {
  25. [self download];
  26. }
  27.  
  28. //内存飙升
  29. -(void)download
  30. {
  31. //1.url
  32. // NSURL *url = [NSURL URLWithString:@"http://imgsrc.baidu.com/forum/w%3D580/sign=54a8cc6f728b4710ce2ffdc4f3cec3b2/d143ad4bd11373f06c0b5bd1a40f4bfbfbed0443.jpg"];
  33.  
  34. NSURL *url = [NSURL URLWithString:@"http://www.33lc.com/article/UploadPic/2012-10/2012102514201759594.jpg"];
  35.  
  36. //2.创建请求对象
  37. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
  38.  
  39. //设置请求头信息,告诉服务器值请求一部分数据range
  40. /*
  41. bytes=0-100
  42. bytes=-100
  43. bytes=0- 请求100之后的所有数据
  44. */
  45. NSString *range = [NSString stringWithFormat:@"bytes=%zd-",self.currentSize];
  46. [request setValue:range forHTTPHeaderField:@"Range"];
  47. NSLog(@"+++++++%@",range);
  48.  
  49. //3.发送请求
  50. NSURLConnection *connect = [[NSURLConnection alloc]initWithRequest:request delegate:self];
  51. self.connect = connect;
  52. }
  53.  
  54. #pragma mark ----------------------
  55. #pragma mark NSURLConnectionDataDelegate
  56. -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
  57. {
  58. NSLog(@"didReceiveResponse");
  59.  
  60. //1.得到文件的总大小(本次请求的文件数据的总大小 != 文件的总大小)
  61. // self.totalSize = response.expectedContentLength + self.currentSize;
  62.  
  63. if (self.currentSize >) {
  64. return;
  65. }
  66.  
  67. self.totalSize = response.expectedContentLength;
  68.  
  69. //2.写数据到沙盒中
  70. self.fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]stringByAppendingPathComponent:@"123.jpg"];
  71.  
  72. NSLog(@"%@",self.fullPath);
  73.  
  74. //3.创建一个空的文件
  75. [[NSFileManager defaultManager] createFileAtPath:self.fullPath contents:nil attributes:nil];
  76.  
  77. //NSDictionary *dict = [[NSFileManager defaultManager]attributesOfItemAtPath:self.fullPath error:nil];
  78.  
  79. //4.创建文件句柄(指针)
  80. self.handle = [NSFileHandle fileHandleForWritingAtPath:self.fullPath];
  81. }
  82.  
  83. -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
  84. {
  85. //1.移动文件句柄到数据的末尾
  86. [self.handle seekToEndOfFile];
  87.  
  88. //2.写数据
  89. [self.handle writeData:data];
  90.  
  91. //3.获得进度
  92. self.currentSize += data.length;
  93.  
  94. //进度=已经下载/文件的总大小
  95. NSLog(@"%f",1.0 * self.currentSize/self.totalSize);
  96. self.progressView.progress = 1.0 * self.currentSize/self.totalSize;
  97. //NSLog(@"%@",self.fullPath);
  98. }
  99.  
  100. -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
  101. {
  102. }
  103.  
  104. -(void)connectionDidFinishLoading:(NSURLConnection *)connection
  105. {
  106. //1.关闭文件句柄
  107. [self.handle closeFile];
  108. self.handle = nil;
  109.  
  110. NSLog(@"connectionDidFinishLoading");
  111. NSLog(@"%@",self.fullPath);
  112. }
  113. @end

#####6.0  大文件断点下载

(1)实现思路

在下载文件的时候不再是整块的从头开始下载,而是看当前文件已经下载到哪个地方,然后从该地方接着往后面下载。可以通过在请求对象中设置请求头实现。

(2)解决方案(设置请求头)

```

//2.创建请求对象

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

//2.1 设置下载文件的某一部分

// 只要设置HTTP请求头的Range属性, 就可以实现从指定位置开始下载

/*

表示头500个字节:Range: bytes=0-499

表示第二个500字节:Range: bytes=500-999

表示最后500个字节:Range: bytes=-500

表示500字节以后的范围:Range: bytes=500-

*/

NSString *range = [NSString stringWithFormat:@"bytes=%zd-",self.currentLength];

[request setValue:range forHTTPHeaderField:@"Range"];

```

(3)注意点(下载进度并判断是否需要重新创建文件)

```objc

//获得当前要下载文件的总大小(通过响应头得到)

NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;

//注意点:res.expectedContentLength获得是本次请求要下载的文件的大小(并非是完整的文件的大小)

//因此:文件的总大小 == 本次要下载的文件大小+已经下载的文件的大小

self.totalLength = res.expectedContentLength + self.currentLength;

NSLog(@"----------------------------%zd",self.totalLength);

//0 判断当前是否已经下载过,如果当前文件已经存在,那么直接返回

if (self.currentLength >0) {

return;

}

```

ios开发网络学习四:NSURLConnection大文件断点下载的更多相关文章

  1. ios开发网络学习十一:NSURLSessionDataTask离线断点下载(断点续传)

    #import "ViewController.h" #define FileName @"121212.mp4" @interface ViewControl ...

  2. ios开发网络学习五:MiMEType ,多线程下载文件思路,文件的压缩和解压缩

    一:MiMEType:一般可以再百度上搜索到相应文件的MiMEType,或是利用c语言的api去获取文件的MiMEType : //对该文件发送一个异步请求,拿到文件的MIMEType - (void ...

  3. 使用NSURLConnection实现大文件断点下载

    使用NSURLConnection实现大文件断点下载 由于是实现大文件的断点下载,不是下载一般图片什么的.在设计这个类的时候本身就不会考虑把下载的文件缓存到内存中,而是直接写到文件系统. 要实现断点下 ...

  4. ios开发网络学习三:NSURLConnection小文件大文件下载

    一:小文件下载 #import "ViewController.h" @interface ViewController ()<NSURLConnectionDataDele ...

  5. ios开发网络学习九:NSURLSessionDownloadTask实现大文件下载

    一:NSURLSessionDownloadTask:实现文件下载:无法监听进度 #import "ViewController.h" @interface ViewControl ...

  6. ios开发网络学习十:利用文件句柄实现大文件下载

    #import "ViewController.h" @interface ViewController ()<NSURLSessionDataDelegate> @p ...

  7. iOS开发RunLoop学习:四:RunLoop的应用和RunLoop的面试题

    一:RunLoop的应用 #import "ViewController.h" @interface ViewController () /** 注释 */ @property ( ...

  8. iOS 大文件断点下载

    iOS 在下载大文件的时候,可能会因为网络或者人为等原因,使得下载中断,那么如何能够进行断点下载呢? // resumeData的文件路径 #define XMGResumeDataFile [[NS ...

  9. Retrofit 2.0 超能实践(四),完成大文件断点下载

    作者:码小白 文/CSDN 博客 本文出自:http://blog.csdn.net/sk719887916/article/details/51988507 码小白 通过前几篇系统的介绍和综合运用, ...

随机推荐

  1. error while loading shared libraries: libpcre.so.0的解决办法

    error while loading shared libraries: libpcre.so.0的解决办法 http://blog.csdn.net/xjkwq1qq/article/detail ...

  2. MD5和sha1加密算法--散列加密技术 MD5:128bit的大整数

    在很多电子商务和社区应用中,我们都要存放很多的客户的资料,其中包括了很多的隐私信息和客户不愿被别人看到的信息,当然好有客户执行各种操作的密码,此时就需要对客户的信息进行加密再存储,目前有两种比较好的加 ...

  3. 关于Webpack详述系列文章 (第四篇)

    1. webpack基本概念 Entry:入口,Webpack 执行构建的第一步将从 Entry 开始,可抽象成输入.Module:模块,在 Webpack 里一切皆模块,一个模块对应着一个文件.We ...

  4. Vue的学习--开始之前的思考

    1.前端后端的思考,到底前端做什么工作 有关前端后端工作的区分,曾经有个朋友告诉我:web开发过程,前端负责从将数据从数据接口提取到前端.路由转换.前端交互展示等等所有工作,后端负责处理数据库里面的数 ...

  5. TC快速搜索在win10下不可用

    今天突然发现TC的快速搜索在win10下突然不可用,按Ctrl + s 呼出快速搜索栏后半天不响应也无法输入文字.论坛里给出来的建议是将 QuickSearch 2.2.3 升级到 2.2.6,目前插 ...

  6. 七、Docker+nginx

    原文:七.Docker+nginx docker run -p 80:80 --name nginx-v1.0.0 -v /usr/nginx/www:/www -v /home/docker/ngi ...

  7. 数据库SQL Server2012笔记(七)——java 程序操作sql server

    1.crud(增删改查)介绍:create/retrieve/update/delete 2.JDBC介绍 1)JDBC(java database connectivity,java数据库连接) 2 ...

  8. android对话框(Dialog)的使用方法

    Activities提供了一种方便管理的创建.保存.回复的对话框机制.比如 onCreateDialog(int), onPrepareDialog(int, Dialog), showDialog( ...

  9. 3. Spring Boot Servlet

    转自:https://blog.csdn.net/catoop/article/details/50501686

  10. AVCaptureSession音频视频采集

    // // AudioVideoCaptureViewController.m // live // // Created by lujunjie on 2016/10/31. // Copyrigh ...