5

認証後に保護されたファイルへのアクセスを許可する単純なラック アプリケーションを作成しています。
ファイル内のデータは機密であるため、アプリケーションの非公開フォルダーに配置されています。

今のところ、セッション データを確認した後、読み取り用にファイルを開き、その内容を応答の本文として送信します。
それは醜く感じられ、大きなファイルでは非常にリソースを消費するに違いありません.

応答例:

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

Rack::Sendfileを調べましたが、私が理解している限り、これはミドルウェアであり、アプリケーション自体からファイルを送信することはできません。

Rack アプリケーションから非公開のバイナリ ファイルを送信する最も効率的な方法は何ですか?

4

2 に答える 2

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) ]
于 2012-10-31T09:25:10.547 に答える
0

別の方法として、 Rack :: Responseオブジェクトを使用する場合は、次のようにすることができます。

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
于 2013-03-08T05:26:35.747 に答える