Quelle est la différence entre send_data et send_file dans Ruby on Rails?

Lequel est le mieux pour le streaming et les téléchargements de fichiers?

Veuillez fournir des exemples.

send_data(_data_, options = {}) send_file(_path_, options = {}) 

La principale différence est que vous transmettez DATA (code binary ou autre) avec send_data ou file PATH avec send_file .

Vous pouvez donc générer des données et les envoyer sous forme de texte en ligne ou en pièce jointe sans générer de fichier sur votre serveur via send_data . Ou vous pouvez envoyer un fichier prêt avec send_file

 data = "Hello World!" send_data( data, :filename => "my_file.txt" ) 

Ou

 data = "Hello World!" file = "my_file.txt" File.open(file, "w"){ |f| f << data } send_file( file ) 

Pour des performances optimales, il est préférable de générer des fichiers une fois et de les envoyer autant de fois que vous le souhaitez. Donc, send_file s'adaptera mieux.

Pour ce qui est de la diffusion en continu, pour autant que je sache, ces deux méthodes utilisent le même tas d'options et de parameters, vous pouvez donc utiliser X-Send ou autre.

UPD

send_data et enregistrer le fichier:

 data = "Hello World!" file = "my_file.txt" File.open(file, "w"){ |f| f << data } send_data( data ) 

send_file peut être plus rapide que send_data

Comme fl00r l’a mentionné , send_file prend un chemin et send_data les données.

Par conséquent, send_file est un sous-ensemble de send_data , car vous avez besoin d’un fichier sur le système de fichiers: vous pouvez bien sûr simplement lire le fichier et utiliser send_data dessus. Mais send_file peut être plus rapide, donc c’est un compromis performance / généralité.

send_file peut être plus rapide car il peut envoyer l’en X-Sendfile tête X-Sendfile sur Apache ( X-Accel-Redirect sur Nginx) au lieu du contenu du fichier, car il connaît le chemin.

Cet en-tête est consommé par le proxy inverse (Apache ou Nginx) qui s’exécute normalement devant Rails dans une configuration de production.

Si X-Sendfile est présent sur la réponse, le proxy inverse ignore la majeure partie de la réponse en cours et en crée une nouvelle qui renvoie le fichier au chemin donné.

 Client <---> Internet <---> Reverse proxy <---> Rails 

Ceci est beaucoup plus efficace car le proxy inverse est hautement spécialisé dans le traitement des fichiers statiques et peut le faire beaucoup plus rapidement que Rails (qui n’envoie pas les données du fichier si X-Sendfile sera envoyé).

Le cas d’utilisation typique de send_file est lorsque vous voulez contrôler l’autorisation d’access aux fichiers statiques: vous ne pouvez pas les placer sous /public ou ils seraient servis avant que Rails ait une chance de décider. Ceci est discuté à: Protéger le contenu de public / dans une application Rails

Pour utiliser les en X-Sendfile têtes X-Sendfile , vous devez append:

 config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx 

to confing/initializers/production.rb ( pas application.rb , puisque dans le développement vous n’avez pas de serveur proxy et que send_file envoie réellement les données).

X-Sendfile est décrit dans le Guide du pipeline d’actifs .