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)")
}

