2012-10-31 29 views
4

我正在製作一個簡單的機架應用程序,在認證後授予對受保護文件的訪問權限。
由於文件中的數據非常敏感,因此它們位於應用程序的非公用文件夾中。從機架應用程序提供非公開二進制文件

現在,在檢查會話數據之後,我只需打開文件進行讀取併發送內容作爲響應的主體。
它感覺很難看,而且對於較大的文件必須非常消耗資源。

迴應示例:

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

我看着Rack::Sendfile,但據我的理解,這是一箇中間件,不能從應用程序自身內部發送文件。

從Rack應用程序發送非公開二進制文件的最有效方法是什麼?

回答

4

機架響應主體必須響應#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) ] 
+0

謝謝你,是否需要在config.ru中添加「使用Rack :: Chunked」以最好地工作? – Eric

+0

除非你有一個多線程/偶數服務器,否。 – simonmenke

+0

感謝您的精確。 – Eric

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 
相關問題