从URL中读取数据并使用ruby on rails将其流回客户端

时间:2011-11-04 14:15:22

标签: ruby-on-rails rack

我还是Ruby和Rails的新手,所以如果答案很明显,请原谅我的问题。我有一个运行时带有名为bucket的控制器的应用程序,当传递id连接到不可路由的子网(10.0.0.xx)时,如果满足某些条件则返回数据。我目前正在send_data控制器中使用bucket方法,但由于这需要一个本地文件,我正在将url的内容读入一个字符串然后返回它。

这对于非常小的文件来说已经足够了,但是对于大型二进制文件来说它太慢了。我真正希望能够做的是使用/ bucket作为代理来回流数据。

以下是我正在使用的控制器的代码:

fileName = "somename.dat"        
content = open(link) {|f| f.read() }
send_data content, :disposition=>'attachment', :filename=>fileName

我希望有人可能会就如何改善这一点提出一些建议。理想情况下,我可以以块的形式读取数据并在收到数据时将其返回。

1 个答案:

答案 0 :(得分:1)

查看rack-proxy,它将从私人服务器读取并为您传递数据。

通过将gem 'rack-proxy'添加到Bundle

进行安装

配置,子类。

示例:

class FooBar < Rack::Proxy

  def rewrite_env(env)
    env["HTTP_HOST"] = "example.com"

    env
  end

  def rewrite_response(triplet)
    status, headers, body = triplet

    headers["X-Foo"] = "Bar"

    triplet
  end

end

有关更多示例,请阅读the tests

作为机架应用,机架代理可以mounted in your rails 3 app简单地完成:

mount FooBar, :at => "/foo_bar"

如果您想了解更多关于机架在Rails生态系统中扮演的角色,请参阅the docs

如果你不喜欢这个代理,或者你想要更多的想法,check out a different implementation