* 移动客户端在和服务器交互的时候,上传和下载使用十分广泛。

* 在我们下载文件的时候,我们在点击暂停的时候可以暂停下载,点击下载的时候可以继续下载,这个功能如何实现?

* 下载进度条如何显示?

先大概叙述一下断点下载的原理:

* 首先先判断要判断要下载的文件在本地沙盒中是否存在。

* 如果存在的话,要判断下载文件的长度。

* 假设文件长度是500,我们发起下载请求的时候应该从500开始。

* 点击暂停下载,应该将链接断掉。

* 再次点击下载的时候,根据下载文件长度,继续下载。

下面与代码结合起来叙述具体的实现:

* 假设我们要下载的文件在服务器的路径为:http://localhost:8080:down/xcode_6.dmg;

* 我们将要下载的文件方法本地沙盒中。文件命名为:xcode.dmg.

* 获取文件保存路径的代码:(折叠)

1 -(NSString *)getFilePath
2 {
3     NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
4     NSString *filePath = [documentsPath stringByAppendingPathComponent:@"xcode.dmg"];
5     return filePath;
6 }

下载文件保存路径

* 因为下载的文件比较大,我们需要采取异步请求网络。

* 异步请求网络常用的有四个代理方法。

* 发起网络请求下载。(下载起始点为上次暂停点,判断上次暂停位置方法是,获取文件属性,从属性中可以查看文件长度,请求点为该长度后面的内容)

* 假设向获取某个字节的内容,可以使用:

    //bytes = 0-499 请求前500个字节的内容

    //bytes = 500- 请求500字节之后的内容

    //bytes = 500-1000 请求资源中某一范围的内容

    //bytes = 0-1,499-500 请求多个范围之间的内容

* 进度条过去文件下载进度,可以使用已经下载的文件的字节数/文件的总字节数。

下面为具体的代码段,里面有详细的注释:

#import <UIKit/UIKit.h>@interface ViewController : UIViewController<NSURLConnectionDataDelegate>
{//进度条变量,显示文件下载进度IBOutlet UIProgressView *_progress;//文件处理,将下载的文件写入本地沙盒NSFileHandle *_fileHandle;//url连接,点解暂停,取消连接,点击下载,开始下载NSURLConnection *_connection;//已经接收数据大小long long _receiveSize;//文件总共的大小long long _totalSize;
}//下载按钮点击响应函数
- (IBAction)download:(id)sender;
//暂停按钮点击响应函数
- (IBAction)pause:(id)sender;@end

- (IBAction)download:(id)sender
{//文件的路径NSString *string = @"http://localhost:8080/down/xcode_6.dmg";//文件的路径转化为urlNSURL *url = [NSURL URLWithString:string];//创建可变请求NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];//判断沙盒路径下有没有这个文件,YES表示这个文件已经下载,NO表示还没有下载if ([[NSFileManager defaultManager] fileExistsAtPath:[self getFilePath]] == YES){//根据文件的属性,获取之前下载数据量是多少NSDictionary *fileDic = [[NSFileManager defaultManager]attributesOfItemAtPath:[self getFilePath] error:nil];//文件的长度就是已经下载的数据量_receiveSize = [fileDic[NSFileSize] longLongValue];//设置Range,从Range之后的内容开始下载//bytes = 0-499 请求前500个字节的内容//bytes = 500- 请求500字节之后的内容//bytes = 500-1000 请求资源中某一范围的内容//bytes = 0-1,499-500 请求多个范围之间的内容NSString *bytes = [NSString stringWithFormat:@"bytes=%lld-",_receiveSize];[request setValue:bytes forHTTPHeaderField:@"Range"];}//发起异步请求,文件比较法,使用异步请求_connection = [NSURLConnection connectionWithRequest:request delegate:self];
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{//分析响应头NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;//获取响应头,是一个字典NSDictionary *responseHeader = httpResponse.allHeaderFields;//接收文件总的大小等于已经下载的数据量,加上为下载的数据量_totalSize = _receiveSize + [responseHeader[@"Content-Length"] longLongValue];//创建文件管理类NSFileManager *fileManager = [NSFileManager defaultManager];//沙盒中不存在要下载的文件,就创建该文件if ([fileManager fileExistsAtPath:[self getFilePath]] == NO){[fileManager createFileAtPath:[self getFilePath] contents:nil attributes:nil];}//根据路径写入文件_fileHandle = [NSFileHandle fileHandleForWritingAtPath:[self getFilePath]];
}- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{//文件比较大的话,需要多次写入,写入的话,需要将光标定位到结尾[_fileHandle seekToEndOfFile];//将数据写入到文件[_fileHandle writeData:data];//最新接收到数据的大小等于文件中已有的数据,加上刚刚下载的数据量_receiveSize = _receiveSize + data.length;//计算进度float jundu = (float)_receiveSize / _totalSize;//使用进度条来表示进度_progress.progress = jundu;
}- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{//文件完成传输,关闭文件管理[_fileHandle closeFile];
}- (IBAction)pause:(id)sender
{//点击暂停,取消请求连接[_connection cancel];_connection = nil;
}-(NSString *)getFilePath
{NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];NSString *filePath = [documentsPath stringByAppendingPathComponent:@"xcode.dmg"];return filePath;
}

转载于:https://www.cnblogs.com/wangyaoguo/p/4816607.html

iOS-文件断点续传相关推荐

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

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

  2. 服务器ios文件,ios 文件到服务器

    ios 文件到服务器 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ.exe.在本地主机和Windows云服务器上分别安装数据传 ...

  3. html5解决大文件断点续传6,解决html5大文件断点续传

    一.概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载.在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了.一般断点下载时才用到Range和Content- ...

  4. 多线程大文件断点续传和流媒体的处理方法

    2019独角兽企业重金招聘Python工程师标准>>> 在使用Squid做反向代理的CDN节点时.多线程大文件断点续传和流媒体的处理是怎么样啦.前些日子花了点时间研究了一下. 在Sq ...

  5. 文件断点续传原理与实现

    文件断点续传原理与实现 在网络状况不好的情况下,对于文件的传输,我们希望能够支持可以每次传部分数据.首先从文件传输协议FTP和TFTP开始分析, FTP是基于TCP的,一般情况下建立两个连接,一个负责 ...

  6. ios上传文件云服务器上,ios文件上传服务器

    ios文件上传服务器 内容精选 换一换 在当前的迁移流程中,可能会存在迁移后ECS控制台镜像名称与实际操作系统不一致的现象.在当前机制下,该现象属于正常现象.该处显示的是下发ECS时使用的镜像名称,而 ...

  7. 飞秋教程:文件断点续传

    飞秋新版本增加了文件断点续传功能,省去了传大文件时因为网络问题中断又得重新开始传的烦恼,节省时间,提高速度,对于已传过的大文件,重新接收时能实现秒传. 默认情况下文件断点续传功能是在文件大于1M时才开 ...

  8. 【飞秋教程】文件断点续传

    文件断点续传 飞秋新版本增加了文件断点续传功能,省去了传大文件时因为网络问题中断又得重新开始传的烦恼,节省时间,提高速度,对于已传过的大文件,重新接收时能实现秒传. 默认情况下文件断点续传功能是在文件 ...

  9. 【最佳实践】OSS开源工具ossutil-大文件断点续传

    经常碰到内部同学或者外部客户问ossutil关于大文件断点续传的问题.本文简单描述下原理并举例说明. 用户可从这里获取ossutil. 官网:https://help.aliyun.com/docum ...

  10. formdata上传文件_封装一个多文件断点续传、分片上传、秒传、重试机制的组件...

    本文为:多文件断点续传.分片上传.秒传.重试机制 的更新版,若想看初始版本的实现,请查看该文章. 凡是要知其然知其所以然 文件上传相信很多朋友都有遇到过,那或许你也遇到过当上传大文件时,上传时间较长, ...

最新文章

  1. oracle dbcontrol界面,oracle enterprise manager配置简介
  2. 反序列化层遍历二叉树
  3. mysql vfp_vfp+mysql问题|交流区 - 梅子Visual FoxPro 编程 - Powered by phpwind
  4. 计算机管理中看不到本地用户,win7系统计算机管理中没有本地用户和组的解决方法...
  5. 面试官 | 说一下什么是代理模式?
  6. Python_字符串
  7. linux debian硬盘安装,Debian硬盘安装方法
  8. GitHub命令使用步骤
  9. 黄聪:基于jQuery+JSON的省市区三级地区联动
  10. easyui自定义图标
  11. Unity 自动寻路入门 NavMeshComponents
  12. 有关计算机专业工作室的名字,盘点最好听的工作室名字大全
  13. 第24期、宠物医院管理系统
  14. 领健医美客户管理系统之医院信息管理系统(HIS)在医院的应用
  15. highcharts 开发笔记
  16. 人工智能发展史(读书笔记)
  17. Matlab 网络通信(TCP IP)
  18. LeetCode-121. 买卖股票的最佳时机(java)
  19. UBT18:ubuntu安装阿里云盘
  20. GAU : Transformer Quality in Linear Time(new attention+)

热门文章

  1. JAVA提取字符串信息中的数字(包括整数,小数)工具类
  2. Undefined reference to ...
  3. arduino接收hmi屏幕_汽车HMI设计中交互设计的发展趋势
  4. jqGrid获取数据库数据的方式
  5. mysql gis vs postgis_mysql空间扩展VSPostGIS
  6. Kubernetes对象之Replication Controller(RC)和Replica Sets(RS)
  7. 手游接入Facebook的那些坑
  8. WebStorm——最智能的Javascript IDE
  9. 让C#语言充当自身脚本!——.NET中的动态编译
  10. python os常用方法_python os模块常用方法