从Rack应用程序提供非公共二进制文件

时间:2012-10-31 07:13:09

标签: ruby rack

我正在制作一个简单的机架应用程序,在认证后授予对安全文件的访问权限 由于文件中的数据是敏感的,因此它们位于应用程序的非公共文件夹中。

现在,在检查会话数据后,我只需打开要读取的文件,然后将内容作为响应正文发送。
它感觉很难看,并且必须非常耗费大量文件。

回复示例:

[ "200", {"Content-Type"=> MIME::Types.type_for(file).first.to_s }, File.open( file ).read() ]

我查看Rack::Sendfile,但就我所知,它是一个中间件,无法从应用程序本身发送文件。

从Rack应用程序发送非公共二进制文件的最有效方法是什么?

2 个答案:

答案 0 :(得分:4)

Rack响应机构必须回复#each{|d|}。所以你可以像这样流式传输响应:

class FileStreamer
  def initialize(path)
    @file = File.open(path)
  end

  def each(&blk)
    @file.each(&blk)
  ensure
    @file.close
  end
end

用法:

[ "200", {"Content-Type"=> MIME::Types.type_for(file).first.to_s }, FileStreamer.new(file) ]

答案 1 :(得分:0)

作为替代方案,如果您使用Rack::Response object,则可以执行以下操作:

response = Rack::Response.new
file = open(path_to_binary_file, "rb")
# other stuff…
mime = Mime.mime_type(::File.extname(file.path), 'text/html')
response.headers.merge!( "Content-Type" => mime ) if mime
response.write file
response.finish