Ruby-Rails直接向客户端提供ftp文件

时间:2010-09-15 21:57:05

标签: ruby-on-rails ruby file ftp download

我是ruby和rails的新手,请原谅我的问题.... 我想知道的是,如何从带有ruby的ftp服务器获取文件而不将文件保存在我的rails应用程序硬盘上(将filedata直接流式传输到客户端)。我正在使用ruby Net / FTP类。

使用Net / FTP类中的“retrbinary”方法,我有以下代码段:

ftp.retrbinary('RETR ' + filename, 4096) { |data|
  buf << data
}

在我的rails视图中,我可以这样做:

send_data( buf )

那么我如何将这两者结合起来呢?我不知道如何实例化缓冲区对象,填写流并将其提供给用户。有人知道怎么做吗?

2 个答案:

答案 0 :(得分:2)

非常感谢您的支持!你的帖子让我继续。喝了几杯咖啡后,我发现了一种有效的解决方案。实际上我正在做以下事情,这对我有用:

def download_file
  filename = params[:file]
  raw = StringIO.new('')
  @ftp.retrbinary('RETR ' + filename, 4096) { |data|
    raw << data
  }
  @ftp.close
  raw.rewind
  send_data raw.read, :filename => filename
end

我将在生产中测试这个(现实生活情况)。如果这不能很好地工作,我必须使用NFS挂载。

答案 1 :(得分:1)

您想要以下内容吗?

1)客户端(浏览器)向Rails服务器发送请求

2)服务器应该响应位于ftp服务器上的文件内容。

是吗?

如果是这样,那么只需将浏览器重定向到ftp位置即可。例如

 # in controller
 ftp_url = "ftp://someserver.com/dir_name/file_name.txt
 redirect_to ftp_url

如果ftp文件具有匿名访问权限,则上述情况有效。

如果您确实需要从服务器访问该文件并对其进行流式传输,请尝试以下操作:

# in controller
render :text => proc {|response, output|
  ftp_session = FTP.open(host, user, passwd, acct)
  ftp_session.gettextfile(remotefile) {|data| output.write(data)}
  ftp_session.close
  }

您应该检查回复中的标题,看看它们是否符合您的要求。

PS。设置ftp连接和从第二台服务器流式传输可能会相对较慢。我会用JS向用户显示繁忙的图形。

我会尝试替代ftp。您可以设置NFS连接或安装远程磁盘吗?会比ftp快得多。还要研究大型TCP窗口大小。