我是ruby和rails的新手,请原谅我的问题.... 我想知道的是,如何从带有ruby的ftp服务器获取文件而不将文件保存在我的rails应用程序硬盘上(将filedata直接流式传输到客户端)。我正在使用ruby Net / FTP类。
使用Net / FTP类中的“retrbinary”方法,我有以下代码段:
ftp.retrbinary('RETR ' + filename, 4096) { |data|
buf << data
}
在我的rails视图中,我可以这样做:
send_data( buf )
那么我如何将这两者结合起来呢?我不知道如何实例化缓冲区对象,填写流并将其提供给用户。有人知道怎么做吗?
答案 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窗口大小。