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

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

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

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

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

send_data( buf )

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

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

 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)客户端(浏览器)向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窗口大小。