rails之间的区别send_data和send_file,举例

你能解释一下, send_datasend_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_filesend_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