"The file couldn’t be opened." UserInfo={NSURL=ftp:/xxxx:xxx@2011@ftp.xxx.com:21/} 的解决方案是什么?

What is solution for "The file couldn’t be opened." UserInfo={NSURL=ftp:/xxxx:xxx@2011@ftp.xxx.com:21/}?

我正在尝试调用 FTP 服务器 api 并希望在 api 成功时获取文件名。 下面的代码我尝试调用 api,

let host = "ftp.xxx.com"
        let user = "xxx"
        let password = "xxx@2011"
        let port = "21"

       let url = URL(string: "ftp://"+user+":"+password+"@"+host+":"+port+"/")
        var data: Data? = nil
        do {
            if let anUrl = url {
                data = try Data(contentsOf: anUrl)
                print(data!)
            }
        } catch {
            print("Unexpected error: \(error).")
        }

当 运行 这段代码时,我收到类似

的错误

错误域=NSCocoaErrorDomain 代码=256 "The file couldn’t be opened."用户信息={NSURL=ftp:/xxxx:xxx@2011@ftp.xxx.com:21/}。

请给我任何解决方案。

问题出在密码中的普通@。这意味着 ftp://xxxx:xxx@2011@ftp.xxx.com:21/ 被解释为使用用户名 xxxx 和密码 xxx 连接到服务器 2011@ftp.xxx.com,这显然是错误的。

解决方案应该是URL-将特殊字符@编码为%40,即使用URL

ftp://xxx:xxx%402011@ftp.xxx.com:21/