rails之间的区别send_data和send_file,举例
你能解释一下, send_data和send_file有什么不同?
哪一个最适合stream式传输和文件下载 ?
send_data(_data_, options = {}) send_file(_path_, options = {})
这里主要的区别在于,你可以用send_data或者文件PATH和send_file传递DATA(二进制代码或者其他)。
因此,您可以生成一些数据,并将其作为内联文本或附件发送,而无需通过send_data在您的服务器上生成文件。 或者你可以用send_file发送准备好的文件
data = "Hello World!" send_data( data, :filename => "my_file.txt" )
要么
data = "Hello World!" file = "my_file.txt" File.open(file, "w"){ |f| f << data } send_file( file )
对于性能,最好生成一次文件,然后多次发送它。 所以send_file
会更好。
对于stream媒体,据我所知,这两种方法使用相同的选项和设置,所以你可以使用X-Send或其他。
UPD
send_data和保存文件:
data = "Hello World!" file = "my_file.txt" File.open(file, "w"){ |f| f << data } send_data( data )
send_file可能比send_data更快
正如fl00提到的那样 , send_file
接受一个path,并send_data
数据。
因此, send_file
是send_data
一个子集,因为你需要在文件系统上有一个文件:你当然可以读取文件并在其上使用send_data
。 但send_file
可以更快,所以这是一个性能/普遍性的权衡。
send_file
可以更快,因为它可以在Apache上发送X-Sendfile
头(Nginx上的X-Accel-Redirect
)而不是文件内容,因为它知道path。
这个头文件被反向代理(Apache或Nginx)使用,它通常在生产环境中运行在Rails之前。
如果响应中存在X-Sendfile
,则反向代理将忽略大部分当前响应,然后构build一个新的文件,以给定path返回文件。
Client <---> Internet <---> Reverse proxy <---> Rails
由于反向代理高度专用于提供静态文件,因此效率要高得多,而且可以比Rails(如果发送X-Sendfile
时不发送文件数据) 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
到confing/initializers/production.rb
( 不是 application.rb
,因为在开发中你没有代理服务器,而你希望send_file
实际发送数据)。
资产pipe道指南中讨论了X-Sendfile
。
- ZSH抱怨RVM __rvm_cleanse_variables:找不到函数定义文件
- 如何检查一个string是否是一个有效的date
- Elastic Beanstalk Ruby / Rails需要安装git所以捆绑安装工程..但不是
- Ruby / Rails:将int转换为时间或从整数获取时间?
- 获取当前ruby进程的内存使用情况
- Rails&Devise:如何呈现没有布局的login页面?
- 捆绑vs RVM vsgemvs RubyGems vs gemsets vs系统ruby
- Javascript有类似Ruby的method_missingfunction吗?
- Ruby 1.8和Ruby 1.9有什么区别?