Swift - HTTP网络操作库SwiftHTTP使用详解2(文件上传、下载)
如果要监听上传、下载进度的话,需要对SwiftHTTP源码做个修改。
SwiftHTTP提供了实时进度的回调函数,但目前版本有bug,会造成进度一直是0.0。

将“Operation.swift”中的如下代码:
四,使用SwiftHTTP进行文件上传
上传的文件必须使用 Upload 对象进行封装,支持使用文件路径和 NSData。
1,使用文件路径上传文件
2,使用NSData上传文件
3,上传时附带上传进度
//handle progress func progressHandler(response: Response, expectedLength: Int64, currentLength: Int64) { guard let handler = response.progressHandler else { return } let slice = 1/expectedLength handler(Float(slice*currentLength)) }修改成:
//handle progress func progressHandler(response: Response, expectedLength: Int64, currentLength: Int64) { guard let handler = response.progressHandler else { return } let slice = 1.0/Float(expectedLength) handler(slice*Float(currentLength)) }这个我也调试了半天才发现造成bug的地方,原代码将两个整型直接相除那结果还是整型,SwiftHTTP作者在后面版本应该会修复。所以目前我们就暂时手动修改下。
上传的文件必须使用 Upload 对象进行封装,支持使用文件路径和 NSData。
1,使用文件路径上传文件
let fileUrl = NSBundle.mainBundle().URLForResource("hangge", withExtension: "zip")! do { let opt = try HTTP.POST("http://www.hangge.com/upload.php", parameters: ["param1": "hangge", "file1": Upload(fileUrl: fileUrl)]) opt.start { response in print(response.description) } } catch let error { print("请求失败: \(error)") }附:服务端代码(upload.php)
<? move_uploaded_file($_FILES["file1"]["tmp_name"], $_SERVER["DOCUMENT_ROOT"]."/uploadFiles/" . $_FILES["file1"]["name"]); echo "保存成功"; ?>
2,使用NSData上传文件
let fileUrl = NSURL(string: "http://www.hangge.com/blog/images/logo.png")! let fileData = NSData(contentsOfURL: fileUrl)! do { let opt = try HTTP.POST("http://www.hangge.com/upload.php", parameters: ["param1": "hangge", "file1": Upload(data: fileData, fileName: "logo.png", mimeType: "")]) opt.start { response in print(response.description) } } catch let error { print("请求失败: \(error)") }
3,上传时附带上传进度
let fileUrl = NSBundle.mainBundle().URLForResource("hangge", withExtension: "zip")! do { let opt = try HTTP.POST("http://www.hangge.com//upload.php", parameters: ["file1": Upload(fileUrl: fileUrl)]) opt.progress = { progress in print("当前进度: \(progress)") //进度是从0到1 } opt.start { response in print("上传完毕!") } } catch let error { print("请求失败: \(error)") }可以看到控制台不断输出已上传进度:

五,使用SwiftHTTP进行文件下载
1,下载文件并保存
let filePath:String = NSHomeDirectory() + "/Documents/hangge.png" do { let opt = try HTTP.GET("http://www.hangge.com/blog/images/logo.png") opt.start { response in let data:NSData = response.data data.writeToFile(filePath, atomically: true) print("下载完毕!保存地址:\(filePath)") } } catch let error { print("请求失败: \(error)") }
2,显示下载进度
let filePath:String = NSHomeDirectory() + "/Documents/hangge.zip" do { let opt = try HTTP.GET("http://www.hangge.com/hangge.zip") opt.progress = { progress in print("当前进度: \(progress)") //进度是从0到1 } opt.start { response in let data:NSData = response.data data.writeToFile(filePath, atomically: true) print("下载完毕!保存地址:\(filePath)") } } catch let error { print("请求失败: \(error)") }
