1

ファイルをクライアントにストリーミングする前に、Content-Length ヘッダーを設定しようとしています。私はそれを設定しています:

response.headers['Content-Length'] = "12341234"

そして、私は次のようなことをします:

steam do |out|
   file_chunks.each do |chunk|
     out << chunk
   end
   out.close
end

ただし、ブラウザーでファイルをダウンロードしようとすると、Content-Length ヘッダーが空白になります。これが Sinatra の問題なのか、Passenger/Apache の問題なのか、誰にもわかりませんか?

何が起こっているのかは、このコードブロック間のレイヤーであり、応答が実際に送信されると、最初にヘッダーが送信され、データブロックが空であるため、明示的に設定してもコンテンツの長さが0であると想定されます。

送信しているファイルの大きさをブラウザに伝える別の方法はありますか?

編集

シナトラの問題ではなく乗客の問題のようです。サーバーを Thin で実行すると、Content-Length が正しく渡されます。すでに設定されている場合、Content-Length を変更しないように質問が変わると思いますか?

4

2 に答える 2

1

ここでの問題は、Transfer-Encoding:chunked を使用すると、Content-Length ヘッダーが省略されることです。

参照: http://greenbytes.de/tech/webdav/rfc2616.html#rfc.section.4.4

于 2017-02-23T11:06:11.420 に答える
0

これはシナトラの問題です。そのストリーム API は、EventMachine ベースのサーバーのみをサポートします。つまり、API は Thin のみをサポートします。Passenger を使用する場合は、Sinatra ストリーム API をバイパスする必要があり、Phusion Passenger でサポートされている Rack ソケット ハイジャック APIを使用して、HTTP 応答を直接ストリーミングする必要があります。以下は、 Phusion Passenger で Server Sent Events をストリーミングするために Rack ソケット ハイジャック API を使用する方法を示す例です。

于 2014-01-14T18:51:45.153 に答える