Ruby on rails RubyonRails中的send_数据和send_文件有什么区别?

Ruby on rails RubyonRails中的send_数据和send_文件有什么区别?,ruby-on-rails,ruby,sendfile,Ruby On Rails,Ruby,Sendfile,哪一个最适合流媒体和文件下载 请举例说明 send_data(_data_, options = {}) send_file(_path_, options = {}) 这里的主要区别在于,使用send_DATA传递数据(二进制代码或任何东西),或者使用send_file传递文件路径 因此,您可以生成一些数据并将其作为内联文本或附件发送,而无需通过send_data在服务器上生成文件。或者您可以使用send\u file data = "Hello World!" send_data( da

哪一个最适合流媒体和文件下载

请举例说明

send_data(_data_, options = {})
send_file(_path_, options = {}) 
这里的主要区别在于,使用send_DATA传递数据(二进制代码或任何东西),或者使用send_file传递文件路径

因此,您可以生成一些数据并将其作为内联文本或附件发送,而无需通过send_data在服务器上生成文件。或者您可以使用send\u file

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


发送文件可能比发送数据快

正如,
send_file
采用路径,而
send_data
采用数据

因此,
send_file
send_data
的一个子集,因为您需要文件系统上的一个文件:您当然可以读取该文件并在其上使用
send_data
。但是
send_file
可以更快,因此这是性能/通用性的权衡

send_file
可以更快,因为它可以在Apache(在Nginx上)上发送头而不是文件内容,因为它知道路径

此头由反向代理(Apache或Nginx)使用,在生产设置中,反向代理通常在Rails前面运行

如果响应中存在
X-Sendfile
,则反向代理将忽略大部分当前响应,并构建一个新的响应,以在给定路径返回文件

Client <---> Internet <---> Reverse proxy <---> Rails
对于
config/initializers/production.rb
(或Rails 5.x中的
config/environment/production.rb
),不是
application.rb
,因为在开发中您没有代理服务器,您希望
send\u file
实际发送数据


X-Sendfile
在上讨论。

谢谢@fl00r。是否有办法将数据保存为文件,然后使用“发送数据”功能进行发送?。因为,我需要服务器中的文件副本。我怎么能做到呢?你的代码中有一个错误:应该是
{f | f嗨,我想知道这个答案是否仍然相关?我现在使用的是Rails 3.2.16,使用的是
send_file
我必须使用文件本身,而不是路径才能让它工作。只是想更新以防其他人遇到这个问题?
data = "Hello World!"
file = "my_file.txt"
File.open(file, "w"){ |f| f << data }
send_data( data )
Client <---> Internet <---> Reverse proxy <---> Rails
config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx