返回 导航

Swift

hangge.com

Swift - FTP客户端的制作(使用Rebekka库)

作者:hangge | 2015-12-23 08:55
下面介绍如何使用第三方库 Rebekka 来进行FTP客户端的开发,实现的功能包括:FTP服务器连接,文件列表的查询,文件夹创建,上传文件,下载文件。

1,Rebekka的说明与配置
Rebekka是一个用Swift语言写的FTP/FTPS客户端操作库。其内部封装使用的是CFNetworking网络库的CFFTPStream API
下载地址:https://github.com/Constantine-Fry/rebekka

(1)把“Rebekka.xcodeproj”拖入到项目中来

(2)在“项目” -> “Build Phases” -> “Target Dependencies”中把“RebekkaTouch”添加进来。

(3)在需要使用的时候 import 即可
import RebekkaTouch

2,初始化连接配置
import UIKit
import RebekkaTouch

class ViewController: UIViewController {
    
    var session: Session!

    override func viewDidLoad() {
        super.viewDidLoad()
       
        var configuration = SessionConfiguration()
        configuration.host = "ftp://ftp.hangge.com"
        configuration.username = "ftpuser"
        configuration.password = "123456"
        session = Session(configuration: configuration)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

3,获取文件、文件夹列表并输出
下面把根目录下的所有文件、文件夹名字打印出来(当然还可以获取到其他信息,比如文件创建者,创建时间等等)
showList("/")
    
func showList(path: String) {
    session.list(path) {
        (resources, error) -> Void in  
        for item in resources!{
            print("文件类型:\(item.type)   文件名称:\(item.name)")
        }
    }
}

4,新建文件夹
createDirectory("/upload/测试文件夹")
    
func createDirectory(path: String) {
    session.createDirectory(path) {
        (result, error) -> Void in
        if result {
            print("文件夹创建成功!")
        }else {
            print("文件夹创建失败: \(error)")
        }
    }
}

5,上传文件
func testUploadFile() {
    //本地文件
    let URL = NSBundle.mainBundle().URLForResource("logo", withExtension: "png")
    //服务器路径以及保存的文件名
    let path = "/upload/\(NSUUID().UUIDString).png"
    //上传文件
    session.upload(URL!, path: path) {
        (result, error) -> Void in
        if result {
            print("文件上传成功!")
        }else {
            print("文件上传失败: \(error)")
        }
    }
}

6,下载文件 
默认下载下来的文件是保存在临时文件夹下并随机命名的。我们可以在下载完毕的回调方法中将其移动到需要的目录(比如用户文档目录)并重命名。
func testDownloadFile() {
    self.session.download("/upload/hangge.png") {
        (fileURL, error) -> Void in
        print("文件保存地址:\(fileURL)")
    
        //下载下来的临时文件,要自行处理
        /**
        if let fileURL = fileURL {
            do {
                try NSFileManager.defaultManager().removeItemAtURL(fileURL) //删除临时文件
            } catch let error as NSError {
                print("Error: \(error)")
            }
        }**/
    }
}

项目源码下载:hangge_990.zip

注意:目前GitHub上的版本发现个bug
不管文件上传失败,还是下载失败。在返回结果中永远是成功的,error也为nil。
bug原因是上传和下载类里的streamEventError方法中忘记给error赋值,解决办法如下(添加高亮代码即可)
2016-06-07更新:目前这个bug原作者已修复更新,大家直接下载使用最新的Rebekka库即可,不用再修改了。

FileUploadOperation.swift
override func streamEventError(aStream: NSStream) {
    self.error = aStream.streamError
    self.fileHandle?.closeFile()
}
FileDownloadOperation.swift
override func streamEventError(aStream: NSStream) {
    self.error = aStream.streamError
    self.fileHandle?.closeFile()
    if self.fileURL != nil {
        do {
            try NSFileManager.defaultManager().removeItemAtURL(self.fileURL!)
        } catch _ {
        }
    }
    self.fileURL = nil
}
评论

全部评论(4)

回到顶部