在 swift 中使用 SFTP 发送 CSV 文件

Sending CSV file with SFTP in swift

我有一个由 webfaction 托管的服务器,我希望能够使用 FTP 或 SFTP 从我的应用程序发送一个 csv 文件。我发现许多库应该像 ConnectionKit, NMSSH, DLSFPT, and LxFTPRequest 这样有帮助。但是,它们都在 objective-c 而不是 swift 中,这使得它们难以阅读、理解和在 Swift 中实现 4. 我尝试实现 LXFTPRequest因为我找到了上传的 swift 实现,这是我的代码:

    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 错误 "Requested action not taken. File unavailable (e.g., file not found, no access)." 查看 webfaction 文档我觉得我只能通过 SFTP 发送文件,这框架不支持。

文档说 "To connect with FTP (for shell users only), substitute the connection type with FTP and the port number with 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)
            }
        }
    }