¿Cuál es mejor para la transmisión por secuencias y la descarga de archivos?
Proporcione ejemplos.
fuente
¿Cuál es mejor para la transmisión por secuencias y la descarga de archivos?
Proporcione ejemplos.
send_data(_data_, options = {})
send_file(_path_, options = {})
La principal diferencia aquí es que pasa DATA (código binario o lo que sea) con send_data o file PATH con send_file .
Por lo tanto, puede generar algunos datos y enviarlos como un texto en línea o como un archivo adjunto sin generar un archivo en su servidor a través de send_data . O puede enviar un archivo listo con send_file
data = "Hello World!"
send_data( data, :filename => "my_file.txt" )
O
data = "Hello World!"
file = "my_file.txt"
File.open(file, "w"){ |f| f << data }
send_file( file )
Para mejorar el rendimiento, es mejor generar el archivo una vez y luego enviarlo tantas veces como desee. Así send_file
encajará mejor.
Para la transmisión, por lo que tengo entendido, ambos métodos usan el mismo conjunto de opciones y configuraciones, por lo que puede usar X-Send o lo que sea.
UPD
send_data y guardar archivo:
data = "Hello World!"
file = "my_file.txt"
File.open(file, "w"){ |f| f << data }
send_data( data )
{ |f| f << data }
.send_file
tuve que usar el archivo en sí, no la ruta para que funcione. ¿Solo quería actualizar en caso de que otros se encuentren con esto?send_file puede ser más rápido que send_data
Como mencionó fl00r ,
send_file
toma una ruta ysend_data
los datos.Por
send_file
lo tanto, es un subconjunto desend_data
, ya que necesita un archivo en el sistema de archivos: por supuesto, podría simplemente leer el archivo y usarlosend_data
. Perosend_file
puede ser más rápido, por lo que se trata de una compensación de rendimiento / generalidad.send_file
puede ser más rápido porque puede enviar elX-Sendfile
encabezado en Apache (X-Accel-Redirect
en Nginx) en lugar del contenido del archivo, ya que conoce la ruta.Este encabezado es consumido por el proxy inverso (Apache o Nginx) que normalmente se ejecuta frente a Rails en una configuración de producción.
Si
X-Sendfile
está presente en la respuesta, el proxy inverso ignora la mayor parte de la respuesta actual y crea una nueva que devuelve el archivo en la ruta dada.Esto es mucho más eficiente ya que el proxy inverso está altamente especializado en servir archivos estáticos y puede hacerlo mucho más rápido que Rails (que no envía los datos del archivo si
X-Sendfile
se enviarán).El caso de uso típico de
send_file
es cuando desea controlar el permiso de acceso de archivos estáticos: no puede colocarlos debajo/public
o de lo contrario se servirían antes de que Rails tenga la oportunidad de decidir. Esto se discute en: Protección del contenido del público / en una aplicación RailsPara usar los
X-Sendfile
encabezados, debe agregar:config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
a
config/initializers/production.rb
(oconfig/environment/production.rb
en Rails 5.x), noapplication.rb
, ya que en desarrollo no tiene un servidor proxy y deseasend_file
enviar los datos.X-Sendfile
se analiza en la Guía de canalización de activos .fuente