iOS使用NSURLConnection实现断点续传下载

本文实例为大家分享了iOS使用NSURLConnection实现断点续传下载的具体代码,供大家参考,具体内容如下

一.断点续传的原理

断点续传的原理:每次在想服务器请求下载数据的同时,要告诉服务器从整个下载文件的数据流的某个还未下载的位置开始下载,然后服务器就返回从哪个位置开始的数据流

二.断点续传的实现

第一步:先声明一些属性

fileprivate var totalSize: Int64 = 0   // 总大小
fileprivate var currentSize: Int64 = 0 // 当前大小
fileprivate var fileName: String?      // 文件名
fileprivate var fullPath: String?      // 文件路劲
fileprivate var handle: FileHandle?    // 句柄
fileprivate var connection: NSURLConnection?

第二步:创建URL和请求

关键是设置请求头

// 下载文件
func urlConnectionDownload(_ url: String) -> NSURLConnection? {
        var request = URLRequest(url: URL(string: url)!)
        // 设置请求头信息
        /*
         bytes=0-1000 表示下载0-1000的数据
         bytes=0-     表示从0开始下载直到下载完毕
         bytes=100-   表示从100开始下载直到下载完毕
         */
        request.setValue("bytes=\(currentSize)", forHTTPHeaderField: "Range")
        // 发送异步请求
        connection = NSURLConnection(request: request, delegate: self)
        return connection
    }
    // 取消下载文件
    func urlConnectionCacel() {
        connection?.cancel()
    }

第三步:设置代理NSURLConnectionDataDelegate

第四步:实现代理NSURLConnectionDataDelegate方法

// 接收到响应头信息的时候就会调用(最先调用的方法),只会调用一次
    func connection(_ connection: NSURLConnection, didReceive response: URLResponse) {
        print("didReceive response")
        // 判断是否已经下载过了
        if currentSize > 0 {
            // 已经下载过的话,就不需要再次接受response了
            return
        }
        // 文件的总大小
        totalSize = response.expectedContentLength
        // 得到的文件名称
        fileName = response.suggestedFilename
        // 边接收数据边写文件到沙盒中
        // 1. 获取文件的全路径
        if let cache = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).last {
            let nsCache = cache as NSString
            fullPath = nsCache.appendingPathComponent(fileName!)
            // 创建一个空的文件
            FileManager.default.createFile(atPath: fullPath!, contents: nil, attributes: nil)
            // 创建句柄
            handle = FileHandle(forWritingAtPath: fullPath!)
        }
    }
    
    func connection(_ connection: NSURLConnection, didReceive data: Data) {
        print("didReceive data")
        // 把文件句柄移动到文件的末尾
        handle?.seekToEndOfFile()
        // 使用文件句柄写数据
        handle?.write(data)
        currentSize += data.count
        print(currentSize / totalSize)
    }
    
    func connectionDidFinishLoading(_ connection: NSURLConnection) {
        print("didFinish loading")
        print(fullPath!)
        handle?.closeFile()
        handle = nil
    }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2022-04-26

总结iOS开发中的断点续传与实践

前言 断点续传概述 断点续传就是从文件上次中断的地方开始重新下载或上传数据,而不是从文件开头.(本文的断点续传仅涉及下载,上传不在讨论之内)当下载大文件的时候,如果没有实现断点续传功能,那么每次出现异常或者用户主动的暂停,都会去重头下载,这样很浪费时间.所以项目中要实现大文件下载,断点续传功能就必不可少了.当然,断点续传有一种特殊的情况,就是 iOS 应用被用户 kill 掉或者应用 crash,要实现应用重启之后的断点续传.这种特殊情况是本文要解决的问题. 断点续传原理 要实现断点续传 , 服

iOS开发网络篇—实现大文件的多线程断点下载

说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始,创建一个和要下载的文件大小相同的文件(如果要下载的文件为100M,那么就在沙盒中创建一个100M的文件,然后计算每一段的下载量,开启多条线程下载各段的数据,分别写入对应的文件部分). 项目中用到的主要类如下: 完成的实现代码如下: 主控制器中的代码: #import "YYViewController.h" #import

iOS实现文件切片储存并且上传(仿断点续传机制)

简介: 我们在开发中,一般在视频类的app或者与硬件交互的app中会有将数据文件上传到云端,少数社交app上传图片也比较多.下面讲的是将数据文件(txt类型)切片储存到本地并逐片上传到云端模仿断点续传的机制,但事实上,这个操作并不是真正的断点续传. google了一下,关于切分的文章也蛮多,但是都比较雷同,接下来要分享将数据写进txt并切片储存到本地,一片一片传到云端的整个流程.下面话不多说了,来一起看看详细的介绍吧. 步骤: 1.将获取到的数据写进文件(总文件) 2.将总文件按照需求分割并储存

iOS开发网络编程之断点续传

前言 网络下载是我们在项目中经常要用到的功能,如果是小文件的下载,比如图片和文字之类的,我们可以直接请求源地址,然后一次下载完毕.但是如果是下载较大的音频和视频文件,不可能一次下载完毕,用户可能下载一段时间,关闭程序,回家接着下载.这个时候,就需要实现断点续传的功能.让用户可以随时暂停下载,下次开始下载,还能接着上次的下载的进度. 今天我们来看看如何自己简单的封装一个断点续传的类,实现如下功能. 1.使用者只需要调用一个接口即可以下载,同时可以获取下载的进度. 2.下载成功,可以获取文件存储的位

iOS11 下载之断点续传的bug的解决方法

iOS11发布之后,可能很多带有下载功能的APP都会躺枪(ps:埋怨苹果爸爸几秒钟).因为原先用来做断点续传的resumeData里带上了一个新值,而这个新值的出现,会导致几次暂停操作后下载任务task读取数据不对,而且在文件还没下载完时就会调用下载完成时的代理方法,导致下载出错.下面就来说说解决的办法. 第一种方法:暂停时不调用[task cancelByProducingResumeData:^(NSData *resumeData){ }];而是调用suspend线程挂起的方法,可解决这个

iOS开发-实现大文件下载与断点下载思路

大文件下载 方案一:利用NSURLConnection和它的代理方法,及NSFileHandle(iOS9后不建议使用) 相关变量: @property (nonatomic,strong) NSFileHandle *writeHandle; @property (nonatomic,assign) long long totalLength; 1>发送请求 // 创建一个请求 NSURL *url = [NSURL URLWithString:@""]; NSURLReque

iOS利用AFNetworking3.0——实现文件断点下载

0.导入框架准备工作 1. 将AFNetworking3.0+框架程序拖拽进项目 2. 或使用Cocopod 导入AFNetworking3.0+ 3.  引入 #import "AFNetworking.h" 1.UI准备工作 A. 定义一个全局的 NSURLSessionDownloadTask:下载管理句柄 由其负责所有的网络操作请求 @interface ViewController () { // 下载句柄 NSURLSessionDownloadTask *_downloa

iOS NSURLSessionDownloadTask实现文件断点下载的方法

所谓断点下载:就是实现开始.暂停.继续以及取消等操作.上一篇我们已经谈到了通过设置代理实现文件的连续下载,也就是文件从开始一直到下载完成,中途不中断.这种方式比较适用一些小文件的下载,比如:微信里面的表情包下砸.就算中途因为其他原因中断了下载,我们重新开始下载也不会浪费用户很多流量,用户体验也不会因此变的很差. 在实现断点下载之前:我们需要清楚对什么进行断点下载,是对网络请求NSURLSession还是对任务NSURLSessionDownloadTask.下载文件只会发送一次请求,我们操作应该

Android实现多线程断点下载的方法

本文实例讲述了Android实现多线程断点下载的方法.分享给大家供大家参考.具体实现方法如下: package cn.itcast.download; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputSt

C#实现文件断点续传下载的方法

本文实例讲述了C#实现文件断点续传下载的方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.IO; using System.Text; using System.Net; namespace simpleDemo { class Program { /// <su

Android实现断点下载的方法

最近做的项目中需要实现断点下载,即用户一次下载可以分多次进行,下载过程可以中断,在目前大多数的带离线缓存的软件都是需要实现这一功能.本文阐述了通过sqlite3简单实现了一个具有断点下载功能的demo.言归正传,开始正文. 设计 数据库表存储元数据 DBHelper.java 用于业务存储的Dao Dao.java 抽象下载信息的Bean LoadInfo.java 呈现下载信息View MainActivity.java 存储下载信息Bean DownloadInfo.java 封装好的下载类

Nginx配置txt、pdf、doc、xls等文件直接下载的方法

使用Nginx时,如果要让一些附件比如 txt,pdf,doc等不直接在浏览器打开,而弹出另存为的对话框(也就是下载) 则可以在nginx的加上头配置如下: 复制代码 代码如下: if ($request_filename ~* ^.*?\.(txt|pdf|doc|xls)$){      add_header Content-Disposition: 'attachment;';  } 如果客户端请求的文件以txt.pdf.doc.xls为后缀的话则会让浏览器出现另存为对话框.

iOS NSURLSessionDownloadTask设置代理文件下载的示例

通过设置代理我们可以拿到下载进度,对于大文件,我们还需要做到开始.暂停.继续以及取消等相应操作,这篇文章先简单的介绍一下通过代理来实现文件下载的问题: #import "ViewController.h" @interface ViewController ()<NSURLSessionDownloadDelegate> @end @implementation ViewController -(void)touchesBegan:(NSSet<UITouch *&g

Android 断点下载和自动安装的示例代码

今天说一下Android中下载App到手机中并自动安装,啥也不说了先上效果图了! 上面呢是下载中的一个图片和下载后会自动提示你安装的一个图片,二话不说,这接开代码吧! 首先来一个下布局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ap