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)
所以我如何结合这两个。我不知道如何实例化一个缓冲区对象,填充流并将其提供给用户。有没有人有一个想法如何做到这一点?
答
你想要以下吗?
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挂载。
鳍
另外:欢迎计算器!记得投票赞成有用的答案,并标记最能回答你问题的答案。 – 2010-09-16 14:04:34