Swift - FTP客户端的制作(使用Rebekka库)
作者:hangge | 2015-12-23 08:55
下面介绍如何使用第三方库 Rebekka 来进行FTP客户端的开发,实现的功能包括:FTP服务器连接,文件列表的查询,文件夹创建,上传文件,下载文件。
2,初始化连接配置
3,获取文件、文件夹列表并输出
5,上传文件
6,下载文件
项目源码下载:hangge_990.zip
FileUploadOperation.swift
1,Rebekka的说明与配置
Rebekka是一个用Swift语言写的FTP/FTPS客户端操作库。其内部封装使用的是CFNetworking网络库的CFFTPStream API。
(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)
站长,这个Rebekka库支持断点续传么
站长回复:这个倒没试过,不太清除是否支持。
文中 上传下载失败的bugerror也为nil。
库已经更新了~
站长回复:谢谢你的提醒,库确实更新修复了这个问题。我要在文章中注明下。
站长,添加高亮代码后,一直上传都是上传失败,控制台是这样显示的“文件上传失败: Optional(Error Domain=kCFErrorDomainCFNetwork Code=2 "(null)" UserInfo={kCFGetAddrInfoFailureKey=8})”不知道是怎么回事?
站长回复:我测试了下是没问题的,你检查下ftp地址,用户密码是不是正确的。不知你填的ftp地址是什么,看错误信息是地址不正确。
站长,这个方法文件上传可以显示文件上传成功,但其实是没有上传成功的。
FTP服务器路径不正确,用户名不正确,密码不正确都可以显示上传成功。
这个是怎么回事啊?
站长回复:你不说我还没发现,看了下这个库源码,发现上传下载有bug。具体解决办法看我文章,现已更新。