ruby on rails rails创建表 Ruby-Rails直接向客户端提供ftp文件




rails路由 (2)

你想要以下吗?

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

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

从Net / FTP类的“retrbinary”方法我有以下片段:

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

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

send_data( buf )

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


Answer #1

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

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





download