host
参数connect
不能是“hostname.com/path/to/ftpupload” 。根据文档,它:
建立与主机的 FTP 连接...
并且“主机”将是“hostname.com”,因此您需要将该字符串拆分为必要的组件。
我会利用 Ruby 的 URI 类并传入完整的 URL:
ftp://hostname.com/path/to/ftpupload
让 URI 解析可以很容易地从中获取部分:
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)
和:
ftp.login(uri.user, uri.password)
允许您使用带有嵌入式用户名和密码的 URL 调用代码:
username:password@hostname.com/path/to/ftpupload
这是使用包含在其中的用户 ID 和密码调用 Internet 资源的标准方式。
那时你只剩下:
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
你的方法调用看起来像:
send_to_ftp(
'path/to/source/file',
'username:password@hostname.com/path/to/ftpupload',
log_path
)