【问题标题】:Sending CSV file with SFTP in swift使用 SFTP 快速发送 CSV 文件
【发布时间】:2018-07-31 16:13:28
【问题描述】:

我有一个由 webfaction 托管的服务器,我希望能够通过 FTP 或 SFTP 从我的应用程序发送一个 csv 文件。我发现了许多可以提供帮助的库,例如 ConnectionKitNMSSHDLSFPTLxFTPRequest。然而,它们都在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 发送我的文件?

【问题讨论】:

  • FTP 不是 SFTP。
  • 是的,我知道我在最后做出了区分。我将进行编辑,以免第一句话造成混淆。
  • 看来你真正的问题是如何在 Swift 中进行 SFTP,而你所有基于 FTP 的代码和你关于它如何工作的叙述都是无关紧要的。你做过研究吗?谷歌搜索“swift sftp”似乎会产生一些有用的点击。

标签: swift file-upload sftp webfaction


【解决方案1】:

我最终使用了 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)
            }
        }
    }

【讨论】:

  • 连接成功后,不满足isConnected条件。不知何故,它会自动断开连接。请帮帮我。
  • 记录 NMSSH:成功连接到端口 990 上的 5x.xx.1xx.xx1。然后是 NMSSH: 建立 SSH 会话失败,并以 NMSSH: Disconnected 结束
猜你喜欢
  • 2012-07-29
  • 2021-11-28
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
相关资源
最近更新 更多