我正在使用Ruby 1.9.3并运行以下命令:
open("ftp://user name:password@datafeeds.domain.com/1234/1234.txt.gz")
返回:
URI :: InvalidURIError:错误的URI(不是URI?)
编码用户名(用%20替换空格)也不起作用:
Net :: FTPPermError:530无效的用户ID /密码
URI在所有浏览器和FTP客户端测试中都能正常工作 - 只是在使用OpenURI时没有。此外,使用Net :: FTP(由OpenURI包装)也可以正常工作:
require 'net/ftp'
ftp = Net::FTP.new
ftp.connect("datafeeds.domain.com", 21)
ftp.login("user name", "password")
ftp.getbinaryfile("/1234/1234.txt.gz")
知道为什么OpenURI方法不起作用,而Net :: FTP方法呢?感谢。
答案 0 :(得分:2)
根据the specification中的定义,URL用户名仅允许使用以下字符:
user alphanum2 [ user ]
[...]
alphanum2 alpha | digit | - | _ | . | +
浏览器因忽略规范而臭名昭着,所以说它们支持它并不是一个好的证据。他们不应该符合规范。
如果cURL支持它们,那么请使用Curb gem并查看是否允许您使用它们。
答案 1 :(得分:1)
根据this StackOverflow answer,您应该能够转义用户名和密码中的特殊字符。你可以这样做:
login = URI.escape('user name') + ':' + URI.escape('password')
open("ftp://#{login}@datafeeds.domain.com/1234/1234.txt.gz")
答案 2 :(得分:1)
open-uri
在这件事上似乎已经破裂了。我的密码与#
字符包含类似的问题。
我最终通过直接设置URI的set_password
实例变量来绕过#
,这不允许@password
字符密码。
uri = URI.parse(...)
if uri.password
uri.instance_variable_set "@password", "password_with_#_char"
end
open(uri) # now this works fine
这很糟糕,但能胜任。