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

问题描述:

我是新来的红宝石和rails,所以请原谅我的问题......。 我想知道的是,如何在没有将文件保存到我的Rails应用程序硬盘(将filedata直接传输到客户端)的情况下使用ruby从ftp服务器获取文件。我正在使用ruby Net/FTP类。Ruby-Rails直接向客户端提供ftp文件

与净/ FTP类我有下面的代码片段的方法 “retrbinary”:

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

在我的rails查看我可以做这样的事情:

send_data(buf)

所以我如何结合这两个。我不知道如何实例化一个缓冲区对象,填充流并将其提供给用户。有没有人有一个想法如何做到这一点?

+0

另外:欢迎计算器!记得投票赞成有用的答案,并标记最能回答你问题的答案。 – 2010-09-16 14:04:34

你想要以下吗?

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窗口大小。

非常感谢您的支持!你的文章让我继续。喝了一杯咖啡后,我找到了一个工作解决方案。其实我正在做以下,这对我很有用:

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挂载。