我还是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
我希望有人可能会就如何改善这一点提出一些建议。理想情况下,我可以以块的形式读取数据并在收到数据时将其返回。
答案 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。