快速使用 SFTP 发送 CSV 文件

Swi*_*ern 1 sftp file-upload webfaction swift

我有一个由 webfaction 托管的服务器,我希望能够通过 FTP 或 SFTP 从我的应用程序发送 csv 文件。我发现许多应该有帮助的库,例如ConnectionKitNMSSHDLSFPTLxFTPRequest。然而,它们都在 Objective-C 中而不是 Swift 中,这使得它们很难在 Swift 4 中阅读、理解和实现。自从我找到了上传的 Swift 实现以来,我尝试实现 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()`
Run Code Online (Sandbox Code Playgroud)

使用这个我几乎让它工作,但我最终得到了 550 错误“未采取请求的操作。文件不可用(例如,找不到文件,无法访问)。” 通过查看 webfaction 文档,我感觉我只能通过 SFTP 发送文件,而这个框架不支持。

该文档说“要使用 FTP 连接(仅适用于 shell 用户),请将连接类型替换为 FTP,将端口号替换为 21。” 我假设因为我从我的应用程序发送数据,所以它不被视为 shell 用户,因此 FTP 不会授予我访问权限(我在这里可能是错的)。如果是这种情况,我将如何使用其他库使用 Swift 而不是 Objective-C 通过 SFTP 发送我的文件?

Swi*_*ern 5

我最终使用了 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)
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)