文件下载

文件下载在我们日常开发中经常使用到,比如:图片,音频,视频等

简单的小文件下载
  • get异步下载
- (void)viewDidLoad {[super viewDidLoad];NSString *urlStr =  @"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1560231628392&di=1ea41537c16f8045d212ef09b24746cc&imgtype=0&src=http%3A%2F%2Fg.hiphotos.baidu.com%2Fzhidao%2Fpic%2Fitem%2F7acb0a46f21fbe094542faa760600c338744ad60.jpg";NSURL *url = [NSURL URLWithString:urlStr];//创建请求NSURLRequest *requst = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15];//创建一个线程NSOperationQueue *queue = [[NSOperationQueue alloc] init];[NSURLConnection sendAsynchronousRequest:requst queue:queue completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {//data是下载的数据UIImage *image = [UIImage imageWithData:data];//回到主线程[[NSOperationQueue mainQueue] addOperationWithBlock:^{self.imageView.image = image;}];}];}

  • 代理方法 监听就现在
    用本地服务器下载一个短视频 本地服务器的搭建可以点击这里查看
//懒加载 属性
- (NSMutableData *)finData {if (!_finData) {_finData = [NSMutableData data];}return _finData;
}- (void)viewDidLoad {[super viewDidLoad];NSString *urlStr =  @"http://localhost/video.mp4";NSURL *url = [NSURL URLWithString:urlStr];//创建请求NSURLRequest *requst = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15];//设置代理 遵循协议[[NSURLConnection alloc] initWithRequest:requst delegate:self];}//收到响应
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{//获取到 总数据的大小self.totalLength = response.expectedContentLength;}//接受数据
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{//拼接数据[self.finData appendData:data];//计算下载NSLog(@"%f",  1.0 *self.finData.length/self.totalLength);}//失败的时候
- (void)connection:(NSURLConnection *)connection didFailWithError:(nonnull NSError *)error{}//加载完成
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
//    NSLog(@"完成---%@",self.finData);self.finData = nil;
}

大文件下载

  • NSFileManager点击这里查看
  • NSFileHandle文件句柄 指针 ,注意:在不用这个对象实例的时候,一定要关闭

当大文件在 下载的时候,我们需要用到NSFileHandle指针类指向,接受文件的数据拼接成一个完成的数据,当然我们也需要NSFileManager创建一个空文件来存储接受的数据

- (void)viewDidLoad {[super viewDidLoad];NSString *urlStr =  @"http://localhost/video.mp4";NSURL *url = [NSURL URLWithString:urlStr];//创建请求NSURLRequest *requst = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15];[[NSURLConnection alloc] initWithRequest:requst delegate:self];}//收到响应
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{self.totalLength = response.expectedContentLength;//获取文件路径NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;self.fullpath = [cachePath stringByAppendingPathComponent:@"123.mp4"];//创建一个空文件[[NSFileManager defaultManager] createFileAtPath:self.fullpath  contents:nil attributes:nil];//创建文件指针self.handle = [NSFileHandle fileHandleForWritingAtPath:self.fullpath];}//接受数据
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{self.currentLegth += data.length;//接受到数据时 将指针 移动数据的末尾[self.handle seekToEndOfFile];//写入文件[self.handle writeData:data];NSLog(@"%f",1.0 * self.currentLegth/self.totalLength);}//失败的时候
- (void)connection:(NSURLConnection *)connection didFailWithError:(nonnull NSError *)error{}//加载完成
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{//下载完成关闭 指针[self.handle closeFile];self.handle = nil;
}

断点下载

  • 主要是设置请求头的内容
  • 原理:根据当前下载文件的大小(记录),设置到请求头再次下载的时候,从当前记录的位置开始下载
///开始下载
- (IBAction)handleStartAction:(UIButton *)sender {NSString *urlStr =  @"http://localhost/video.mp4";NSURL *url = [NSURL URLWithString:urlStr];//创建请求NSMutableURLRequest *requst = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15];//设置请求头//从当前在下在文件的大小 开始下载 self.currentLegth 记录之前下载的位置NSString *rangeByte = [NSString stringWithFormat:@"bytes=%zd-",self.currentLegth];[requst setValue:rangeByte forHTTPHeaderField:@"Range"];self.connection  = [[NSURLConnection alloc] initWithRequest:requst delegate:self];}///取消i下载- (IBAction)handleCancleAction:(UIButton *)sender {[self.connection cancel];}//收到响应
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{//再次下载的时候,如果已经存在了,就直接return,从记录的位置下载if (self.currentLegth > 0) {return;}self.totalLength = response.expectedContentLength;//获取文件路径NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;self.fullpath = [cachePath stringByAppendingPathComponent:@"123.mp4"];//创建一个空文件[[NSFileManager defaultManager] createFileAtPath:self.fullpath  contents:nil attributes:nil];//创建文件指针self.handle = [NSFileHandle fileHandleForWritingAtPath:self.fullpath];}//接受数据
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{self.currentLegth += data.length;//接受到数据时 将指针 移动数据的末尾[self.handle seekToEndOfFile];//写入文件[self.handle writeData:data];self.proviessView.progress = 1.0 * self.currentLegth/self.totalLength;NSLog(@"%f",1.0 * self.currentLegth/self.totalLength);}//失败的时候
- (void)connection:(NSURLConnection *)connection didFailWithError:(nonnull NSError *)error{}//加载完成
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{//下载完成关闭 指针[self.handle closeFile];self.handle = nil;
}

iOS之网络下载文件相关推荐

  1. rtthread + STM32F407VE + esp8266 +SD卡 从网络下载文件存到SD卡中

    学习rtthread,通过文章记录学习过程的一些问题. 手上有一块STM32F407VE的核心板(带sd卡槽,连接MCU的SDIO),和安信可的esp8266-12F模块,现以此为基础实现从网络上下载 ...

  2. rstp 小米网络摄像头_国家部门调查联邦美国快递,联通VoLTE试商用开启,iOS蜂窝网络下载上限提高,小米申请屏下摄像头专利,这就是今天的其他大新闻!...

    今天是6月1日 农历四月廿八 今天小黑胖过节啦 大家快给我投食鸡腿 下面是今天的其他大新闻  # 国家有关部门决定立案调查美国联邦快递  ( IT之家 )根据央视网的报道,最近,美国联邦快递在我国发生 ...

  3. iOS开发·网络下载总结(NSURLConnection,NSURLSession,AFNetworking)

    0. 前言 iOS的开发中的网络下载方式包括NSData(最原始,实际开发基本不会用),NSURLConnection(古老又过气的苹果原生网络框架),NSURLSession(现在流行的苹果网络框架 ...

  4. JAVA从网络下载文件到本地

    1.首推一种方法,封装好的FileUtils,简单一句话就搞定 /*** 下载文件---返回下载后的文件存储路径* * @param url 文件地址* @param dir 存储目录* @param ...

  5. iOS开发网络篇—文件的上传

    说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代码. 主控制器的关键代码: Y ...

  6. 【Python】Python的urllib模、urllib2模块的网络下载文件

    因为需要从一些下载一个页PDF文件.但是需要下载PDF有数百个文件,这是不可能用人工点击下载.只是Python有相关模块,所以写一个程序PDF文件下载,顺便熟悉Python的urllib模块和ulrl ...

  7. python模块下载1002python模块下载_【Python】Python的urllib模、urllib2模块的网络下载文件...

    因为需要从一些下载一个页PDF文件.但是需要下载PDF有数百个文件,这是不可能用人工点击下载.只是Python有相关模块,所以写一个程序PDF文件下载,顺便熟悉Python的urllib模块和ulrl ...

  8. 利用tftp和nfs下载文件到开发板

    2019独角兽企业重金招聘Python工程师标准>>> 一.Linux下安装nfs服务器: 1. 安装nfs服务 $sudo apt-get install nfs-kernel-s ...

  9. 如何用python创建一个下载网站-如何写一个python脚本下载文件??

    脚本在最后,可以直接试用,相关的库可能需要自己安装 第一步,你需要获得网页上下载文件地址的列表 用浏览器查看页面源文件得到 /> 可以看到,这个格式是很清晰的,用xpath获得列表即可, 这部分 ...

最新文章

  1. 编译、链接和运行详解
  2. Apache Kafka-通过设置Consumer Group实现广播模式
  3. php mysql 安装错误_Apache+php配置 Mysql安装出错解决办法
  4. swing 状态视图分离_Java Swing模型视图适配器介体
  5. 亚马逊涨了 $4 千亿?!为什么它能成为疫情中获益最大的公司
  6. MFC开发IM-第二十三篇、C++中 UTF-8转成Unicode
  7. 径向涡轮膨胀机行业调研报告 - 市场现状分析与发展前景预测
  8. python批量创建实例_Django批量创建Model实例
  9. 财富不入急门,投资且慢一点
  10. 写失败数据写入成功_深度 | 缓存与数据库一致性问题剖析
  11. 处理Simulink的代数环的方法为逐个添加一阶惯性环节
  12. 电脑同时打开多个软件如何设置
  13. solidworks 之迈迪同步轮尺寸与设计不复的解决
  14. 截止失真放大电路_一起学模电:6、放大电路静态与动态分析方法
  15. 工业物联网:平台架构、关键技术与应用实践
  16. 由浅入深学习android input系统(五) - input系统的启动
  17. Linux 邻居子系统介绍
  18. unity3d音频基础知识
  19. 《Beta Embeddings for Multi-Hop Logical Reasoning in Knowledge Graphs》论文阅读笔记
  20. 【社区图书馆】《普林斯顿微积分读本》

热门文章

  1. window镜像制作
  2. 什么是数据流图 Data Flow Diagram (DFD)
  3. linux SIGSEGV信号 内存访问错误 Segmentation fault
  4. insetSelective 和insert的区别
  5. 友盟push java_友盟U-Push推送与获取状态
  6. 织足袜子机报道:全国棉花收购价低于去年 加工量同比大减
  7. 关于__construct()和__destruct
  8. Linux监控平台搭建Zabbix(资源)
  9. 售前售后问题(甲润)
  10. 全面升级!网易易盾发布设备DNA指纹系统