我有一个由 webfaction 托管的服务器,我希望能够使用 FTP 或 SFTP 从我的应用程序发送一个 csv 文件。我发现许多库应该有帮助,例如 ConnectionKit , NMSSH , DLSFPT , 和 LxFTPRequest .然而,所有这些都在 objective-c 而不是 swift 中,这使得它们很难在 Swift 4 中阅读、理解和实现。我尝试实现 LXFTPRequest,因为我找到了一个快速的上传实现,这是我的代码:
let fileName = "user-data.csv"
guard let path = FileManager.default.urls(for: .documentDirectory, in:.userDomainMask).first else {fatalError(ErrorMessageStrings.couldntAccessDocs.rawValue)}
let fileURL = path.appendingPathComponent(fileName)
let folderLocation = "/home/path/"
let uploadUrl = URL(string: "ftp://server-name.webfaction.com" + folderLocation)
let request = LxFTPRequest.upload()
request?.serverURL = uploadUrl
request?.localFileURL = fileURL
request?.username = "username"
request?.password = "password"
request?.successAction = { (resultClass, result) in
print("File uploaded")
}
request?.failAction = { (domain, error, errorMessage) in
print(error)
print(errorMessage?.description)
fatalError("Connection could not be made. Action was not completed.")
}
request?.progressAction = {(_ totalSize: Int, _ finishedSize: Int, _ finishedPercent: CGFloat) -> Void in
print(finishedPercent)
}
request?.start()`
使用它我几乎可以让它工作,但我最终遇到 550 错误“未采取请求的操作。文件不可用(例如,未找到文件,无法访问)。”查看 webfaction 文档,我觉得我只能通过 SFTP 发送文件,而这个框架不支持。
文档说“要连接 FTP(仅限 shell 用户),请将连接类型替换为 FTP,并将端口号替换为 21。”我假设因为我从我的应用程序发送数据,所以它不算作 shell 用户,因此 FTP 不授予我访问权限(我在这里可能是错的)。如果是这种情况,我将如何使用其他库使用 Swift 而不是 objective-c 通过 SFTP 发送我的文件?
最佳答案
我最终使用了 NMSSH 并在 Swift 中使用它,它并不像我想象的那么复杂。
let session = NMSSHSession.init(host: serverHost, port: xx, andUsername: serverUsername)
session.connect()
if session.isConnected{
session.authenticate(byPassword: serverPasswordString)
if session.isAuthorized == true {
let sftpsession = NMSFTP(session: session)
sftpsession.connect()
if sftpsession.isConnected {
sftpsession.writeFile(atPath: csvFileURL.path, toFileAtPath: folderLocation)
}
}
}
关于swift - 快速使用 SFTP 发送 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51617805/