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

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

* 下载进度条如何显示?

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

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

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

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

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

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

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

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

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

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

 -(NSString *)getFilePath
{
NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[];
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"xcode.dmg"];
return filePath;
}

下载文件保存路径

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

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

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

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

    //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";
//文件的路径转化为url
NSURL *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;
}

iOS-文件断点续传的更多相关文章

  1. iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载+使用输出流代替文件句柄

    前言:本篇讲解,在前篇iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载的基础上,使用输出流代替文件句柄实现大文件断点续传.    在实际开发中,输入输出流用的比较少,但 ...

  2. iOS——文件操作NSFileManager (创建、删除,复制,粘贴)

    iOS——文件操作NSFileManager (创建.删除,复制,粘贴)       iOS的沙盒机制,应用只能访问自己应用目录下的文件.iOS不像android,没有SD卡概念,不能直接访问图像.视 ...

  3. IOS文件操作的两种方式:NSFileManager操作和流操作

    1.常见的NSFileManager文件方法 -(NSData *)contentsAtPath:path //从一个文件读取数据 -(BOOL)createFileAtPath: path cont ...

  4. 文件断点续传原理与实现—— ESFramework 通信框架4.0 进阶(12)

    在ESFramework通信框架 4.0 快速上手(13) -- 文件传送,如此简单一文的详细介绍和ESFramework通信框架 4.0 快速上手(14) -- 聊天系统Demo,增加文件传送功能( ...

  5. IOS 文件解析

    import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java ...

  6. iOS文件处理类

    iOS文件处理类 这是一个用来简化iOS中关于文件操作的一个类,所有方法都为类方法. Source File.h // // File.h // FileManager // // http://ho ...

  7. iOS文件上传文件URL错误Invalid parameter not satisfying: fileURL'

    一:iOS文件上传提示URL错误 Invalid parameter not satisfying: fileURL' 二:解决方法: NSString *imagePath = [[NSBundle ...

  8. IOS 文件夹结构

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/MyGameZone/article/details/24494765 IOS文件夹结构 说明 这些仅 ...

  9. js -- fileData 实现文件断点续传

    前端实现文件的断点续传 一.一些知识准备 断点续传,既然有断,那就应该有文件分割的过程,一段一段的传. 以前文件无法分割,但随着HTML5新特性的引入,类似普通字符串.数组的分割,我们可以可以使用sl ...

  10. php实现大文件断点续传下载实例

    php实现大文件断点续传下载实例,看完你就知道超过100M以上的大文件如何断点传输了,这个功能还是比较经典实用的,毕竟大文件上传功能经常用得到. require_once('download.clas ...

随机推荐

  1. 剑指offer18 树的子结构

    另一种写法 class Solution { public: bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) { bool result = f ...

  2. OO作业第三单元总结

    目录 一.JML语言理论基础及应用工具链 二.部署JMLUnitNG,自动生成测试用例 三.架构设计 第一次作业 第二次作业 第三次作业 四.Bug分析 五.心得体会 一.JML语言理论基础及应用工具 ...

  3. Unicode与ASCiI之间有什么区别?java当中的转义字符 Character类的使用 String类的使用

    ASCII码 称为 美国标准信息交换码 (American standard code of Information Interchange) 其中一共有多少个码?2的7次幂 128个 Unicode ...

  4. iOS应用架构谈-part1概述

    当我们讨论客户端应用架构的时候,我们在讨论什么? 其实市面上大部分应用不外乎就是颠过来倒过去地做以下这些事情: --------------- --------------- ------------ ...

  5. UICollectionView实现无限轮播

    #import "KGNewsController.h"#import "KGNewsCell.h"#import "KGNews.h"#i ...

  6. cin 和 getline 混用中需要注意的问题

    这段时间在刷题过程中遇到一个cin和getline混合使用中的问题,解决之后记录如下: 先来看一段代码 #include <iostream> #include <string> ...

  7. Linux - which xxx - 查找执行的命令所在的路径

    Linux 下,我们常使用 cd ,grep,vi 等命令,有时候我们要查到这些命令所在的位置,如何做呢? Linux 下有2个命令可完成该功能:which ,whereis which 用来查看当 ...

  8. windows charles 抓包https请求

    charles证书     2.设置host和端口 3.浏览器访问即可抓到https的请求  

  9. python入门:从安装python开始

    python简介: Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明 ...

  10. linux系统入门—文件管理

    目录 linux系统入门-文件管理 系统目录结构 目录管理 linux系统入门-文件管理 系统目录结构 几乎所有的计算机操作系统都是使用目录结构组织文件.具体来说就是在一个目录中存放子目录和文件,而在 ...