2

我有以下上传文件的方法:

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

当我将 URL 输入为hostname.com/path/to/ftpupload时,出现错误:“名称或服务未知”。但是,如果我只输入“hostname.com”作为主机它可以工作,但这意味着无法确定将文件放在 ftp 服务器上的哪个位置

4

2 回答 2

3

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
)
于 2013-05-28T13:42:30.613 回答
0

您将相同的参数传递给FTP#connectand FTP#chdir。他们实际上需要完整 URL 的单独部分,即域名和路径。尝试以下操作:

domain, dir = host.split('/', 2)
#...
ftp.connect(domain, port) # domain = 'hostname.com'
#...
ftp.chdir(dir) # dir = 'path/to/ftpupload'
于 2013-05-28T13:12:20.303 回答