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