Swift HTTP网络操作库Alamofire实现文件下载,断点续传例子

七,使用Alamofire进行文件下载

1,自定义下载文件的保存目录
下面代码将logo图片下载下来保存到用户文档目录下(Documnets目录),文件名不变。

Alamofire.download(.GET, "yun_qi_img/logo.png") {
    temporaryURL, response in
    let fileManager = NSFileManager.defaultManager()
    let directoryURL = fileManager.URLsForDirectory(.DocumentDirectory,
        inDomains: .UserDomainMask)[0]
    let pathComponent = response.suggestedFilename
            
    return directoryURL.URLByAppendingPathComponent(pathComponent!)
}

2,使用默认提供的下载路径
Alamofire内置的许多常用的下载路径方便我们使用,简化代码。比如,下载到用户文档目录下可以改成:

let destination = Alamofire.Request.suggestedDownloadDestination(
    directory: .DocumentDirectory, domain: .UserDomainMask)
        
Alamofire.download(.GET, "yun_qi_img/logo.png",
    destination: destination)

3,下载进度

下面代码在文件下载过程中会不断地打印下载进度,同时下载完成后也会打印完成信息。

let destination = Alamofire.Request.suggestedDownloadDestination(
    directory: .DocumentDirectory, domain: .UserDomainMask)
        
Alamofire.download(.GET, "http://www.hangge.com/favicon.ico", destination: destination)
    .progress { (bytesRead, totalBytesRead, totalBytesExpectedToRead) in
        let percent = totalBytesRead*100/totalBytesExpectedToRead
        print("已下载:\(totalBytesRead)  当前进度:\(percent)%")
    }
    .response { (request, response, _, error) in
        print(response)
}

4,断点续传(Resume Data)
当下载过程中被意外停止时,可以在响应方法中把已下载的部分保存起来,下次再从断点继续下载。
下面通过样例演示如何断点续传:
(1)程序启动后自动开始下载文件
(2)点击“停止下载”,终止下载并把已下载的数据保存起来,进度条停止走动。
(3)点击“继续下载”,从上次终止的地方继续下载,进度条继续走动。
原文:Swift - HTTP网络操作库Alamofire使用详解3(文件下载,断点续传)   原文:Swift - HTTP网络操作库Alamofire使用详解3(文件下载,断点续传)

import UIKit
import Alamofire
 
class ViewController: UIViewController {
    
    //停止下载按钮
    @IBOutlet weak var stopBtn: UIButton!
    //继续下载按钮
    @IBOutlet weak var continueBtn: UIButton!
    //下载进度条
    @IBOutlet weak var progress: UIProgressView!
    
    //下载文件的保存路径
    let destination = Alamofire.Request.suggestedDownloadDestination(
        directory: .DocumentDirectory, domain: .UserDomainMask)
    
    //用于停止下载时,保存已下载的部分
    var cancelledData: NSData?
    
    //下载请求对象
    var downloadRequest: Request!
    
    override func viewDidLoad() {
        super.viewDidLoad()
       
        //页面加载完毕就自动开始下载
        self.downloadRequest =  Alamofire.download(.GET,
            "http://dldir1.qq.com/qqfile/qq/QQ7.9/16621/QQ7.9.exe",
            destination: destination)
        
        self.downloadRequest.progress(downloadProgress) //下载进度
        
        self.downloadRequest.response(completionHandler: downloadResponse) //下载停止响应
    }
    
    //下载过程中改变进度条
    func downloadProgress(bytesRead: Int64, totalBytesRead: Int64,
        totalBytesExpectedToRead: Int64) {
        let percent = Float(totalBytesRead)/Float(totalBytesExpectedToRead)
        
        //进度条更新
        dispatch_async(dispatch_get_main_queue(), {
            self.progress.setProgress(percent,animated:true) 
        })
        print("当前进度:\(percent*100)%")
    }
    
    //下载停止响应(不管成功或者失败)
    func downloadResponse(request: NSURLRequest?, response: NSHTTPURLResponse?,
        data: NSData?, error:NSError?) {
        if let error = error {
            if error.code == NSURLErrorCancelled {
                self.cancelledData = data //意外终止的话,把已下载的数据储存起来
            } else {
                print("Failed to download file: \(response) \(error)")
            }
        } else {
            print("Successfully downloaded file: \(response)")
        }
    }
    
    //停止按钮点击
    @IBAction func stopBtnClick(sender: AnyObject) {
        self.downloadRequest?.cancel()
        self.stopBtn.enabled = false
        self.continueBtn.enabled = true
    }
    
    //继续按钮点击
    @IBAction func continueBtnClick(sender: AnyObject) {
        if let cancelledData = self.cancelledData {
            self.downloadRequest = Alamofire.download(resumeData: cancelledData,
                destination: destination)
            
            self.downloadRequest.progress(downloadProgress) //下载进度
            
            self.downloadRequest.response(completionHandler: downloadResponse) //下载停止响应
            
            self.stopBtn.enabled = true
            self.continueBtn.enabled = false
        }
    }
 
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

时间: 2024-09-21 13:36:03

Swift HTTP网络操作库Alamofire实现文件下载,断点续传例子的相关文章

Swift HTTP网络操作库Alamofire实现文件上传详解

六,使用Alamofire进行文件上传 1,Alamofire支持如下上传类型: File Data Stream MultipartFormData 2,使用文件流的形式上传文件 let fileURL = NSBundle.mainBundle().URLForResource("hangge", withExtension: "zip")   Alamofire.upload(.POST, "http://www.hangge.com/upload.

Swift HTTP网络操作库Alamofire使用详解1(配置,以及数据请求)

一,Alamofire的说明与配置     1,什么是Alamofire (1)Alamofire 的前身是 AFNetworking.AFNetworking 是 iOS 和 OS X 上很受欢迎的第三方HTTP网络基础库. (2)其实 AFNetwork 的前缀 AF 便是 Alamofire 的缩写. (3)Swift发布后,AFNetworking的作者又用Swift语言写了个相同功能的库,这便是 Alamofire. (4)Alamofire 本质是基于`NSURLSession`,并

Swift实现HTTP网络操作库Alamofire使用详解4(用户权限认证)

  八,使用Alamofire进行用户认证 1,Alamofire支持如下几种认证(Authentication) 本文讲解使用 Alamofire 进行 HTTP Basic 验证. 2,HTTP Basic认证介绍 (1)HTTP Basic认证是允许HTTP服务器对WEB浏览器进行用户身份证的方法. (2)当一个客户端向HTTP服务器进行数据请求时,客户端会接收到HTTP服务器的身份认证要求,这时客户端会提示用户输入用户名及密码,然后将用户名及密码以BASE64加密.并于每次请求数据时,将

Swift HTTP网络操作库SwiftHTTP使用详解1(配置,及数据请求)

一,SwiftHTTP的说明与配置 1,什么是SwiftHTTP SwiftHTTP本质是基于`NSURLSession`,并做了封装.使用SwiftHTTP可以让我们网络请求相关代码(如获取数据,提交数据,上传文件,下载文件等)更加简洁易用.(有点类似于我前面文章介绍的另一个网络库:Alamofire) 2,SwiftHTTP的功能特性: (1)便利的闭包API (2)支持运行队列(NSOperationQueue) (3)支持参数编码 (4)内置JSON请求序列化 (5)上传/下载文件带有进

[快速学会Swift第三方库] Alamofire篇

[快速学会Swift第三方库] Alamofire篇 Alamofire是 Swift 语言的 HTTP 网络开发工具包,AFNetworking的 Swift 版,使用起来相当简单. 目录 快速学会Swift第三方库 Alamofire篇 目录 编码之前 导入Alamofire 其他操作 Web请求 示例代码 运行结果 数据请求JSON 示例代码 运行结果 上传文件 示例代码 运行结果 下载文件 示例代码 运行结果 深入学习 编码之前 导入Alamofire 推荐使用CocoaPods进行导入

swift常用的第三方库列表

https://github.com/Alamofire/Alamofire 网络请求库 https://github.com/SwiftyJSON/SwiftyJSON 更易用的json https://github.com/danielgindi/ios-charts 图形图表库 https://github.com/MengTo/Spring 封装了一些动画的库 https://github.com/Ramotion/animated-tab-bar tabbar实现动画 https://

浅论Android网络请求库——android-async-http

在iOS开发中有大名鼎鼎的ASIHttpRequest库,用来处理网络请求操作,今天要介绍的是一个在Android上同样强大的网络请求库android-async-http,目前非常火的应用Instagram和Pinterest的Android版就是用的这个网络请求库.这个网络请求库是基于Apache HttpClient库之上的一个异步网络请求处理库,网络处理均基于Android的非UI线程,通过回调方法处理请求结果. 其主要特征如下:处理异步Http请求,并通过匿名内部类处理回调结果,Htt

Qt之高级网络操作(HTTP/FTP快速上手)

简述 Qt Network 模块中提供了一些高级别的类,例如:QNetworkRequest.QNetworkReply 和 QNetworkAccessManager,使用常见的协议执行网络操作. 在分享的过程中,顺便介绍下 Fiddler,便于我们调试.Fiddler 是一个 HTTP 协议调试代理工具.当然,也可以使用其它 Web/HTTP 调试工具. 简述 HTTP 消息结构 支持的协议 请求 传递 URL 参数 代理 更加复杂的 POST 请求 定制请求头 响应内容 响应状态码 响应头

Android网络请求库android-async-http介绍_Android

Android网络请求库:android-async-http开源框架 之前有一篇描述了客户端请求服务器端的方式-Post的请求方式.今天介绍一个请求服务器的一个开源库-android-async-http库. 1. 概念: 这个网络请求库是基于Apache HttpClient库之上的一个异步网络请求处理库,网络处理均基于Android的非UI线程,通过回调方法(匿名内部类)处理请求结果. 2. 特征: (1).处理异步Http请求,并通过匿名内部类处理回调结果 **(2).**Http异步请