Welches eignet sich am besten für Streaming und Dateidownloads?
Bitte geben Sie Beispiele an.
quelle
Welches eignet sich am besten für Streaming und Dateidownloads?
Bitte geben Sie Beispiele an.
send_data(_data_, options = {})
send_file(_path_, options = {})
Der Hauptunterschied besteht darin, dass Sie DATA (Binärcode oder was auch immer) mit send_data oder file PATH mit send_file übergeben .
Sie können also einige Daten generieren und als Inline-Text oder als Anhang senden, ohne über send_data eine Datei auf Ihrem Server zu generieren . Oder Sie können eine fertige Datei mit send_file senden
data = "Hello World!"
send_data( data, :filename => "my_file.txt" )
Oder
data = "Hello World!"
file = "my_file.txt"
File.open(file, "w"){ |f| f << data }
send_file( file )
Aus Leistungsgründen ist es besser, eine Datei einmal zu generieren und sie dann so oft zu senden, wie Sie möchten. So send_file
wird besser passen.
Soweit ich weiß, verwenden beide Methoden für das Streaming die gleichen Optionen und Einstellungen, sodass Sie X-Send oder was auch immer verwenden können.
UPD
send_data und Datei speichern:
data = "Hello World!"
file = "my_file.txt"
File.open(file, "w"){ |f| f << data }
send_data( data )
{ |f| f << data }
.send_file
musste die Datei selbst verwenden, nicht den Pfad, damit sie funktioniert. Wollten Sie nur aktualisieren, falls andere darauf stoßen?send_file ist möglicherweise schneller als send_data
Wie bereits erwähnt ,
send_file
nimmt fl00r einen Pfad undsend_data
die Daten.Daher
send_file
ist eine Teilmenge vonsend_data
, da Sie eine Datei im Dateisystem benötigen: Sie können die Datei natürlich einfach lesen und darauf verwendensend_data
. Abersend_file
kann schneller sein, so ist es eine Leistung / Allgemeinheit trade-off ist.send_file
kann schneller sein, weil es denX-Sendfile
Header auf Apache (X-Accel-Redirect
auf Nginx) anstelle des Dateiinhalts senden kann , da es den Pfad kennt.Dieser Header wird vom Reverse-Proxy (Apache oder Nginx) verwendet, der normalerweise in einem Produktions-Setup vor Rails ausgeführt wird.
Wenn
X-Sendfile
die Antwort vorhanden ist, ignoriert der Reverse-Proxy den größten Teil der aktuellen Antwort und erstellt eine neue, die die Datei unter dem angegebenen Pfad zurückgibt.Dies ist viel effizienter, da der Reverse-Proxy hochspezialisiert auf die Bereitstellung statischer Dateien ist und dies viel schneller als Rails kann (der die Dateidaten nicht sendet, wenn
X-Sendfile
sie gesendet werden).Der typische Anwendungsfall
send_file
ist, wenn Sie die Zugriffsberechtigung für statische Dateien steuern möchten: Sie können sie nicht ablegen, da sie/public
sonst bereitgestellt werden, bevor Rails die Möglichkeit hat, sich zu entscheiden. Dies wird unter folgender Adresse erläutert: Schutz des Inhalts von public / in einer Rails-AppUm die
X-Sendfile
Header verwenden zu können, müssen Sie Folgendes hinzufügen:config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
an
config/initializers/production.rb
(oderconfig/environment/production.rb
in Rails 5.x) nichtapplication.rb
, da Sie in der Entwicklung keinen Proxyserver haben undsend_file
die Daten tatsächlich senden möchten .X-Sendfile
wird im Asset Pipeline-Handbuch erläutert .quelle