我正在开发一个RubyonRails应用程序,它可以与RackspaceCloudFiles进行通信(类似于AmazonS3,但缺少一些功能)
由于缺乏每对象访问权限和查询字符串身份验证,用户的下载必须通过应用程序进行调解
在Rails 2.3中,您可以动态构建响应,如下所示:
#将大约180 MB生成的数据流到浏览器。
呈现:文本=>;过程{响应,输出|
十倍于我|
write(“这是第#{i}\n行”)
终止
}
(来自http://api.rubyonrails.org/classes/ActionController/Base.html#M000464)
我可以将我的cloudfiles流生成代码转储到那里,而不是10\u 000\u 000.times…
问题是,这是我在Rails 3中尝试使用此技术时得到的输出
#<;程序:[email protected]/Users/jderiksen/lt/lt uber/site/app/controllers/prospect\u uploads\u controller.rb:75>;
看起来可能没有调用proc对象的调用方法?还有其他想法吗
为response_body分配一个对象,该对象响应#每个:
类拖缆
定义每个
十倍于我|
产生“这是第#{i}\n行”
终止
终止
终止
self.response_body=拖缆.new
如果您使用的是1.9.x或Backports gem,则可以使用枚举器更简洁地编写它。新建:
self.response_body=Enumerator.new do|y|
十倍于我|
y<&书信电报;“这是第#{i}\n行”
终止
终止
请注意,何时和是否刷新数据取决于所使用的机架处理程序和底层服务器。例如,我已经确认Mongrel将流式传输数据,但其他用户报告说,例如WEBrick会将数据缓冲到响应关闭为止。无法强制响应刷新
在Rails 3.0.x中,还有几个附加问题:
- 在开发模式中,由于与类重新加载的不良交互,从枚举中访问模型类等操作可能会出现问题。这是Rails 3.0.x中的一个开放bug
-
机架和导轨之间的交互中的一个错误导致每个请求调用两次
#each。这是另一个开放的bug。您可以使用以下猴子补丁解决此问题:类机架::响应 def关闭 @body.close如果@body.response_to?(:close) 终止 终止
这两个问题在Rails 3.1中都得到了修复,其中HTTP流是一个选框特性
请注意,另一个常见的建议,self.response_body=proc{| response,output |…},在Rails 3.0.x中确实有效,但在3.1中已被弃用(并且不再实际传输数据)。分配一个响应#每个的对象在所有Rails 3版本中都有效