我有以下方法上传文件:
def send_to_ftp(sourcefile,host,port,username,password,log_path)
begin
ftp =Net::FTP.new
ftp.connect(host, port)
ftp.passive = true
ftp.login(username, password)
ftp.chdir(host)
ftp.putbinaryfile(sourcefile)
ftp.close
return true
rescue Exception => err
puts err.message
return false
end
end
当我输入网址为hostname.com/path/to/ftpupload
时,我收到错误:"名称或服务未知"。但是,如果我只输入" hostname.com"作为它的主机,但它意味着没有办法确定将文件放在ftp服务器上的位置
答案 0 :(得分:3)
host
的{{1}}参数不能是“hostname.com/path/to/ftpupload”。根据文档,它:
建立与主持人的FTP连接......
并且“host”将是“hostname.com”,因此您需要将该字符串拆分为必要的组件。
我会利用Ruby的URI类并传入一个完整的URL:
connect
让URI解析,以便从中抓取部分:
ftp://hostname.com/path/to/ftpupload
以下是我写的方式:
require 'uri'
uri = URI.parse('ftp://hostname.com/path/to/ftpupload')
uri.host
# => "hostname.com"
uri.path
# => "path/to/ftpupload"
通过两次更改,您可以进一步简化代码。将方法定义更改为:
require 'uri'
def send_to_ftp(sourcefile, host, username, password, log_path)
uri = URI.parse('ftp://' + host)
ftp = Net::FTP.new
ftp.connect(uri.host, uri.port)
ftp.passive = true
ftp.login(username, password)
ftp.chdir(uri.path)
ftp.putbinaryfile(sourcefile)
ftp.close
true
rescue Exception => err
puts err.message
false
end
和
def send_to_ftp(sourcefile, host, log_path)
允许您使用带有嵌入式用户名和密码的URL调用代码:
ftp.login(uri.user, uri.password)
这是使用其中包含的用户标识和密码调用互联网资源的标准方法。
此时你就离开了:
username:password@hostname.com/path/to/ftpupload
,您的方法调用如下:
require 'uri'
def send_to_ftp(sourcefile, host, log_path)
uri = URI.parse('ftp://' + host)
ftp = Net::FTP.new
ftp.connect(uri.host, uri.port)
ftp.passive = true
ftp.login(uri.user, uri.password)
ftp.chdir(uri.path)
ftp.putbinaryfile(sourcefile)
ftp.close
true
rescue Exception => err
puts err.message
false
end
答案 1 :(得分:0)
您将相同的参数传递给FTP#connect
和FTP#chdir
。它们实际上需要完整URL的单独部分,即域名和路径。请尝试以下方法:
domain, dir = host.split('/', 2)
#...
ftp.connect(domain, port) # domain = 'hostname.com'
#...
ftp.chdir(dir) # dir = 'path/to/ftpupload'