下面是源码,注释掉的部分代码是一次性下载的功能(不推荐),正常运行的代码实现了:

- 功能:根据提供的URL下载网络文件

PS:其中有6个关键字,是实现该功能使用到的知识点,我在代码的后面做了必要的归纳和整理。

#define kReceivedTotal @"receivedTotal"
#define kTotal @"total"
#import "ViewController.h"@interface ViewController () <NSURLConnectionDelegate, NSURLConnectionDataDelegate>
{//全局连接对象,用来取消下载NSURLConnection *_connection;double _totalLength;    //获取数据总长度NSMutableData *_totalData;    //接收到的数据double _receiveLength;    //接收到的数据长度//判断是否正在下载BOOL isDownloading;//下载文件路径NSString *_filePath;
}
@end@implementation ViewController
- (void)viewDidLoad {[super viewDidLoad];//①:NSUserDefaults类
-------------------    //读取本地化的plist文件,获取已下载数据量和文件总大小NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];_receiveLength = [[userDefault objectForKey:kReceivedTotal] doubleValue];_totalLength = [[userDefault objectForKey:kTotal] doubleValue];//作用:程序退出后会记录退出前下载的情况,下一次进入后会根据上一次退出时的情况改变progress和label的样式if (_totalLength > 0) {double progress = _receiveLength / _totalLength;_progressLabel.text = [NSString stringWithFormat:@"%.2f%%", progress*100];_progressLine.progress = progress;}}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}#pragma mark - 按钮:点击下载方法
- (IBAction)startDownload:(UIButton *)sender {//如果点击下载按钮立即跳出下载完成,很可能试url有问题。此处找的是QQ音乐上的url,第二天便会更新//isDownloading:用于判断下载状态。进入下载时为YES,下载完成时为NOif (!isDownloading) {NSURL *url = [NSURL URLWithString:@"http://218.205.82.11/mobileoc.music.tc.qq.com/F000003BiKB44LknC0.flac?continfo=122542B50C9B1A0317535549A8AD143E8038EA7648884166&vkey=8078E72D66A07AD5C4B3696E52E8702B0612145B7EFF5BBB77FEAB63A1D6673DE51521C2D4397D8D659204309621EBB8EABA0FFD614A4171&guid=27238e629f2f6ffc850c749439bf81a1824fc41d&fromtag=55&uin=290363831"];//②:NSURLRequest
----------------NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];//通过http下载请求头来设置继续下载的位置NSString *value = [NSString stringWithFormat:@"bytes=%i-", (int)_receiveLength];[request setValue:value forHTTPHeaderField:@"Range"];//NSLog(@"继续下载:%@", request.allHTTPHeaderFields);//③:NSURLConnection
-------------------//发送异步网络请求_connection = [NSURLConnection connectionWithRequest:request delegate:self];//此时正在下载isDownloading = YES;//1.下面是不设置断点续传时的写法:在路径下直接创建单例文件用于保存下载到的数据//④:NSFileManager
-----------------//        //创建空文件来保存下载数据
//        NSString *fileName = @"听爸爸的话.mp3";
//        _filePath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/%@", fileName];
//        //为路径创建单例
//        [[NSFileManager defaultManager] createFileAtPath:_filePath contents:nil attributes:nil];//2.断点续传的写法//创建临时目录路径_filePath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/tmp/%@", @"听爸爸的话.mp3"];//NSLog(@"%@", _filePath);//判断临时文件是否存在,如果不存在则创建if (![[NSFileManager defaultManager] fileExistsAtPath:_filePath]) {//先创建临时文件夹NSString *dirPath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/tmp"];[[NSFileManager defaultManager] createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:nil];//创建空的临时文件[[NSFileManager defaultManager] createFileAtPath:_filePath contents:nil attributes:nil];}}
}#pragma mark - 按钮:点击暂停下载方法
- (IBAction)cancelDownload:(UIButton *)sender {//取消下载[_connection cancel];//把数据包存入文件[self appendFileData:_totalData];//释放内存_totalData.data = nil;isDownloading = NO;//暂停时,保存已下载数据量和文件总数量到本地,保证程序退出后下次进入仍然可以实现断点续传[self saveUserDefaulst];
}#pragma mark - 文件写入方法
-(void) appendFileData:(NSData *) data {if (data.length == 0 || _filePath.length == 0) {//文件有误return;}//⑤:NSFileHandle
----------------NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:_filePath];[fileHandle seekToEndOfFile];[fileHandle writeData:data];[fileHandle closeFile];
}#pragma mark - NSURLConnectionDelegate
-(void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;//获取响应头NSDictionary *fields = httpResponse.allHeaderFields;//获取下载文件的总长度if (_totalLength == 0) {NSNumber *length = fields[@"Content-Length"];_totalLength = [length doubleValue];}//用于存放下载得到的数据,这是存放在内存中的_totalData = [[NSMutableData alloc] init];
}-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
//    double progress = _totalData.length / _totalLength;//根据当前下载的数据包大小来刷新进度条和Label的现实[_totalData appendData:data];_receiveLength += data.length;double progress = _receiveLength / _totalLength;//刷新UIself.progressLabel.text = [NSString stringWithFormat:@"%.2f%%", progress*100];self.progressLine.progress = progress;if (_totalData.length > 500*1024) {[self appendFileData: _totalData];//释放内存_totalData.data = nil;}
}-(void)connectionDidFinishLoading:(NSURLConnection *)connection {//方法1:该写法用于一次性完整下载(不推荐)
//    //下载完成后保存数据到本地
//    NSURL *url = connection.currentRequest.URL;
//    NSString *urlString = url.absoluteString;
//    NSString *fileName = urlString.lastPathComponent;
//
//    //根据?分割符存放数据到数组
//    NSArray *array = [fileName componentsSeparatedByString:@"?"];
//    //获取文件名
//    fileName = array[0];
//
//    //获取沙盒路径
//    NSString *filePath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/%@", fileName];
//    NSLog(@"%@", filePath);
//
//    //把数据写入文件
//    [_totalData writeToFile:filePath atomically:YES];//方法2:该方法满足了断点下载,虽然增大了开销但是确保了下载的安全性//文件末尾不足500KB大小的数据也要写入文件,所以文件下载“完成”后还要调用一个appendFileData方法[self appendFileData:_totalData];//清楚缓存_totalData.data = nil;self.progressLabel.text = @"下载完成";isDownloading = NO;//将下载完成的文件从临时目录剪切到目的目录NSFileManager *manager = [NSFileManager defaultManager];//确定目录文件路径NSString *targetFilePath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/%@", @"听爸爸的话.mp3"];//判断目标文件是否存在,如果存在把旧文件删除,准备剪切操作if ([manager fileExistsAtPath:targetFilePath]) {[manager removeItemAtPath:targetFilePath error:nil];}//剪切方法的限制:不能把已经存在文件覆盖,如果此文件存在,在剪切之前需要先删除[manager moveItemAtPath:_filePath toPath:targetFilePath error:nil];//保存数据[self saveUserDefaulst];//下载完成把已下载数据量和文件总大小清零_receiveLength = 0;_totalLength = 0;
}#pragma mark - NSUserDefaults 保存下载的数据量和文件数据量到本地
-(void) saveUserDefaulst {//下载完成时,保存已下载数据量和文件宗数据量到本地NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];[userDefault setObject:@(_receiveLength) forKey:kReceivedTotal];[userDefault setObject:@(_totalLength) forKey:kTotal];//数据同步写入到plist文件[userDefault synchronize];
}
@end

iOS网络编程---根据URL下载网络文件的方法相关推荐

  1. (网络编程)URL下载网络资源

    URL下载网络资源 URL,统一资源定位符,定位网络上的某一资源. 可以利用URL下载网络上的资源. 例如下载网易云音乐网站的音乐. 复制上述请求URL public class Demo01Url ...

  2. iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载

    前言:iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载是在前篇iOS开发之网络编程--使用NSURLConnection实现大文件下载的基础上进行    断点续传的设置 ...

  3. Java 网络编程 03 —— URL下载资源

    系列文章目录 Java 网络编程 01 -- Socket TCP通信 Java 网络编程 02 -- Socket UDP通信 Java 网络编程 03 -- URL下载资源 文章目录 系列文章目录 ...

  4. (转)C#网络编程(订立协议和发送文件) - Part.4

    源码下载:http://www.tracefact.net/SourceCode/Network-Part4.rar C#网络编程(订立协议和发送文件) - Part.4 文件传输 前面两篇文章所使用 ...

  5. UDP网络编程和URL编程

    UDP网络通信 代码示例: 流 程: 1.DatagramSocket与DatagramPacket 2.建立发送端,接收端 3.建立数据包 4.调用Socket的发送.接收方法 5.关闭Socket ...

  6. android 网络mp3格式,Android 使用URLConnection下载音频文件的方法

    有时候我们会需要下载音频文件.这里提供一种思路,将在线音频文件通过流写到本地文件中. 使用URLConnection来建立连接,获取到的数据写到文件中. URLConnection建立连接后,可以获取 ...

  7. linux网络编程(一)网络基础传输知识

    linux网络编程(一)网络传输基础知识 一.什么是协议? 二.使用步骤 典型协议 2.网络应用程序设计模式 C/S模式 B/S模式 优缺点 3.分层模型 4.TCP/IP四层模型 通信过程 5.协议 ...

  8. python网络编程需要学什么,python网络编程学习笔记(五):socket的一些补充 Python 网络编程需要学习哪些网络相关的知识...

    python的socket编程问题hdr = recvall(s, 5) if hdr is None: print 'Unexpected EOF receivingstruct在unpack的时候 ...

  9. Java网络编程 Socket、ServerSocket 详解,方法介绍及完整代码示例

    Java网络编程 Socket.ServerSocket 详解,方法介绍及完整代码示例 概念 什么是网络编程? 网络编程是指编写运行在多个设备(计算机)的程序,这些设备通过网络连接起来.当这些通过网络 ...

  10. java从url下载文件_从URL下载Java文件

    java从url下载文件 Today we will learn how to download a file from URL in java. We can use java.net.URL op ...

最新文章

  1. Tomcat 架构原理解析到架构设计借鉴
  2. java弹出微信扫一扫_JAVA实现调用微信js-sdk扫一扫
  3. Linux文本过滤与处理命令
  4. oracle 语法分析表,Oracle 语句优化分析说明
  5. python官网的软件好用吗-为何强烈不推荐去学python?
  6. Access 导出各种格式文件
  7. python简说(二十二)写日志
  8. 利用C#进行Socket通信编程之二:一个实例
  9. typescript继承和重写
  10. linux遍历目录漏洞,Mutiny 多个目录遍历漏洞(CVE-2013-0136)
  11. dismiss ios pop效果_iOS实现自定义炫酷的弹出视图(popView)
  12. lgv20刷twrp_TWRP 新增对 Realme C2, LG V20等设备的支持
  13. win7旗舰版系统下载
  14. zimbra更换服务器域名
  15. 什么是网络攻击?网络攻击手段有哪些?
  16. 星星城堡童装加盟雾非雾
  17. 诚之和:字节再迎裁员潮温州百人“大撤退”、ohayoo应届生“团灭”
  18. 浅谈量子量化股票交易的基本原理
  19. 【日拱一卒】如何编写测试用例(下)
  20. 2020Android开发陷入饱和,移动开发者未来的出路在哪里,我们该如何让应对?

热门文章

  1. libnet库的安装与使用
  2. 【惯性导航姿态仪】 07 Mini INS/GPS 数据输出处理以及 C语言实现
  3. iec611313标准下载_IEC611313标准及其实现
  4. NPU-电工电子技术第一章作业讲评
  5. RFID技术在图书馆中的应用
  6. 余世维+金正昆+陈安之+曾仕强+张锦贵等资料集
  7. 计算机安全审计技术工作总结,计算机安全审计技术研究
  8. 当前版本与卡刷包android_安卓7.0 xposed框架卡刷包
  9. 计算机图形学【GAMES-101】4、纹理映射(重心坐标插值、透视投影矫正、双线性插值MipMap、环境光遮蔽AO)
  10. 5W1H 图书管理系统