如何使用Net :: FTP将文件复制到单独的服务器上?

时间:2012-04-02 21:55:10

标签: ruby-on-rails ruby ftp net-ftp

我正在构建一个Rails应用程序,它会在注册时为每个用户创建一个bookmarklet文件。我想将该文件保存到远程服务器上,所以我正在尝试基于"Rails upload file to ftp server"的Ruby的Net :: FTP。

我试过这段代码:

  require 'net/ftp'

  FileUtils.cp('public/ext/files/script.js', 'public/ext/bookmarklets/'+resource.authentication_token )
  file = File.open('public/ext/bookmarklets/'+resource.authentication_token, 'a') {|f| f.puts("cb_bookmarklet.init('"+resource.username+"', '"+resource.authentication_token+"', '"+resource.id.to_s+"');$('<link>', {href: '//***.com/bookmarklet/cb.css',rel: 'stylesheet',type: 'text/css'}).appendTo('head');});"); return f }
  ftp = Net::FTP.new('www.***.com')
  ftp.passive = true
  ftp.login(user = '***', psswd = '***')
  ftp.storbinary("STOR " + file.original_filename, StringIO.new(file.read), Net::FTP::DEFAULT_BLOCKSIZE)
  ftp.quit()

但我收到的错误是文件变量为nil。我可能在这里做了几件事。我是Ruby和Rails的新手,所以欢迎任何帮助。

1 个答案:

答案 0 :(得分:1)

File.open的块形式不返回文件句柄(即使它确实如此,它也会在那时关闭)。也许将您的代码粗略地改为:

require '…'
FileUtils.cp …
File.open('…','a') do |file|
  ftp = …
  ftp.storbinary("STOR #{file.original_filename}", StringIO.new(file.read))
  ftp.quit
end

可替换地:

require '…'
FileUtils.cp …
filename = '…'
contents = IO.read(filename)
ftp = …
ftp.storbinary("STOR #{filename}", StringIO.new(contents))
ftp.quit