Mr.*_*ack 75 ruby ruby-on-rails sendfile
哪一个最适合流媒体和文件下载?
请提供示例.
fl0*_*00r 103
send_data(_data_, options = {})
send_file(_path_, options = {})
Run Code Online (Sandbox Code Playgroud)
这里的主要区别是您使用send_data传递DATA(二进制代码或其他)或使用send_file 传递文件PATH .
因此,您可以生成一些数据并将其作为内联文本或附件发送,而无需通过send_data在服务器上生成文件.或者您可以使用send_file发送ready文件
data = "Hello World!"
send_data( data, :filename => "my_file.txt" )
Run Code Online (Sandbox Code Playgroud)
要么
data = "Hello World!"
file = "my_file.txt"
File.open(file, "w"){ |f| f << data }
send_file( file )
Run Code Online (Sandbox Code Playgroud)
对于性能,最好生成一次文件,然后根据需要多次发送.所以send_file
会更合适.
对于流式传输,据我所知,这两种方法都使用相同的选项和设置,因此您可以使用X-Send等.
UPD
send_data并保存文件:
data = "Hello World!"
file = "my_file.txt"
File.open(file, "w"){ |f| f << data }
send_data( data )
Run Code Online (Sandbox Code Playgroud)
Cir*_*四事件 19
send_file可能比send_data快
正如fl00r所提到的,send_file
采用路径和send_data
数据.
因此,您需要文件系统上的文件send_file
的子集send_data
:您当然可以只读取文件并使用send_data
它.但send_file
可以更快,所以这是一种性能/普遍性的权衡.
send_file
可以更快,因为它可以X-Sendfile
在Apache(X-Accel-Redirect
在Nginx上)而不是文件内容上发送标头,因为它知道路径.
此标头由反向代理(Apache或Nginx)使用,反向代理通常在生产设置中的Rails前运行.
如果X-Sendfile
响应中存在,则反向代理会忽略大部分当前响应,并构建一个返回给定路径上的文件的新响应.
Client <---> Internet <---> Reverse proxy <---> Rails
Run Code Online (Sandbox Code Playgroud)
这样效率要高得多,因为反向代理非常专注于提供静态文件,并且可以比Rails(如果X-Sendfile
将发送不发送文件数据)快得多.
典型的用例send_file
是当你想要控制静态文件的访问权限时:你不能把它们放在下面/public
,否则它们会在Rails有机会决定之前得到服务.这在以下讨论:在Rails应用程序中保护公共内容
要使用X-Sendfile
标题,您必须添加:
config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
Run Code Online (Sandbox Code Playgroud)
to config/initializers/production.rb
(不是 config/environment/production.rb
,因为在开发中你没有代理服务器而你想要application.rb
实际发送数据).
send_file
在资产管道指南中讨论.
归档时间: |
|
查看次数: |
53812 次 |
最近记录: |