当前位置: > > > Swift - HTTP网络操作库SwiftHTTP使用详解2(文件上传、下载)

Swift - HTTP网络操作库SwiftHTTP使用详解2(文件上传、下载)

如果要监听上传、下载进度的话,需要对SwiftHTTP源码做个修改。
SwiftHTTP提供了实时进度的回调函数,但目前版本有bug,会造成进度一直是0.0。
将“Operation.swift”中的如下代码:
//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作者在后面版本应该会修复。所以目前我们就暂时手动修改下。

四,使用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)")
}
可以看到控制台不断输出已下载进度:

评论0