如何上传带有远程文件目标的文件作为URL的一部分?

时间:2013-05-28 12:51:39

标签: ruby

我有以下方法上传文件:

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服务器上的位置

2 个答案:

答案 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#connectFTP#chdir。它们实际上需要完整URL的单独部分,即域名和路径。请尝试以下方法:

domain, dir = host.split('/', 2)
#...
ftp.connect(domain, port) # domain = 'hostname.com'
#...
ftp.chdir(dir) # dir = 'path/to/ftpupload'