ストリーミングとファイルのダウンロードに最適なのはどれですか?
例を挙げてください。
send_data(_data_, options = {})
send_file(_path_, options = {})
ここでの主な違いは、send_dataを使用してDATA(バイナリコードなど)を渡すか、 send_fileを使用してfilePATHを渡すことです。
したがって、 send_dataを介してサーバー上にファイルを生成せずに、データを生成してインラインテキストまたは添付ファイルとして送信できます。または、 send_fileを使用して準備完了ファイルを送信できます
data = "Hello World!"
send_data( data, :filename => "my_file.txt" )
または
data = "Hello World!"
file = "my_file.txt"
File.open(file, "w"){ |f| f << data }
send_file( file )
パフォーマンスを上げるには、ファイルを1回生成してから、必要な回数だけ送信することをお勧めします。だからsend_file
、より良くフィットします。
ストリーミングの場合、私が理解している限り、この方法はどちらも同じ一連のオプションと設定を使用するため、X-Sendなどを使用できます。
UPD
send_dataと保存ファイル:
data = "Hello World!"
file = "my_file.txt"
File.open(file, "w"){ |f| f << data }
send_data( data )
send_fileはsend_dataよりも高速である可能性があります
fl00rが述べたようにsend_file
、パスとsend_data
データを取ります。
したがってsend_file
、はのサブセットですsend_data
。ファイルシステム上にファイルが必要なためです。もちろん、ファイルを読み取って使用することもできますsend_data
。ただしsend_file
、より高速になる可能性があるため、パフォーマンスと一般性のトレードオフになります。
send_file
パスを知っているので、ファイルコンテンツの代わりにX-Sendfile
Apache(Nginx)でヘッダーを送信できるため、より高速になります。X-Accel-Redirect
このヘッダーは、通常、実稼働セットアップでRailsの前で実行されるリバースプロキシ(ApacheまたはNginx)によって消費されます。
が応答に存在する場合X-Sendfile
、リバースプロキシは現在の応答のほとんどを無視し、指定されたパスでファイルを返す新しい応答を作成します。
Client <---> Internet <---> Reverse proxy <---> Rails
リバースプロキシは静的ファイルの提供に高度に特化しており、Rails(送信される場合はファイルデータを送信しない)よりもはるかに高速に実行できるため、これははるかに効率的ですX-Sendfile
。
の典型的な使用例はsend_file
、静的ファイルのアクセス許可を制御したい場合です。静的ファイルを下に置くことはできません。そうしない/public
と、Railsが決定する前にそれらが提供されます。これについては、次の場所で説明されています:Railsアプリでのpublic/のコンテンツの保護
ヘッダーを使用するには、X-Sendfile
以下を追加する必要があります。
config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
開発中はプロキシサーバーがなく、実際にデータを送信したいので、to config/initializers/production.rb
(またはconfig/environment/production.rb
Rails 5.xでは)ではありません。 application.rb
send_file
X-Sendfile
アセットパイプラインガイドで説明されています。