83

ストリーミングとファイルのダウンロードに最適なのはどれですか?

例を挙げてください。

4

2 に答える 2

114
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 )
于 2011-04-04T08:28:30.243 に答える
21

send_fileはsend_dataよりも高速である可能性があります

fl00rが述べたようにsend_file、パスとsend_dataデータを取ります。

したがってsend_file、はのサブセットですsend_data。ファイルシステム上にファイルが必要なためです。もちろん、ファイルを読み取って使用することもできますsend_data。ただしsend_file、より高速になる可能性があるため、パフォーマンスと一般性のトレードオフになります。

send_fileパスを知っているので、ファイルコンテンツの代わりにX-SendfileApache(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.rbRails 5.xでは)ではありません。 application.rbsend_file

X-Sendfileアセットパイプラインガイドで説明されています。

于 2014-11-12T10:13:00.580 に答える