我正在制作一个简单的机架应用程序,在认证后授予对安全文件的访问权限 由于文件中的数据是敏感的,因此它们位于应用程序的非公共文件夹中。
现在,在检查会话数据后,我只需打开要读取的文件,然后将内容作为响应正文发送。
它感觉很难看,并且必须非常耗费大量文件。
回复示例:
[ "200", {"Content-Type"=> MIME::Types.type_for(file).first.to_s }, File.open( file ).read() ]
我查看Rack::Sendfile,但就我所知,它是一个中间件,无法从应用程序本身发送文件。
从Rack应用程序发送非公共二进制文件的最有效方法是什么?
答案 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