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

Eri*_*ric 5 ruby rack

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

现在,在检查会话数据之后,我只是打开文件进行读取,并将内容作为响应的主体发送.
它感觉很丑,对于较大的文件来说必须非常耗费资源.

响应示例:

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

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

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

sim*_*nke 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
Run Code Online (Sandbox Code Playgroud)

用法:

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