跳至内容 跳至搜索

Action Controller 数据 Streaming

用于发送任意数据和将文件流式传输到浏览器的方法,而不是渲染。

方法
S
包含的模块

实例私有方法

send_data(data, options = {})

将给定的二进制数据发送到浏览器。此方法类似于 render plain: data,但它还允许您指定浏览器是否应将响应显示为文件附件(即在下载对话框中)还是作为内联数据。您还可以设置内容类型、文件名和其他内容。

选项:* :filename - 建议浏览器使用的文件名。* :type - 指定 HTTP 内容类型。默认为 application/octet-stream。您可以为使用 Mime::Type.register 注册的类型指定字符串或符号,例如 :json。如果省略,类型将从 :filename 中指定的扩展名推断出来。如果扩展名没有注册内容类型,将使用默认类型 application/octet-stream。* :disposition - 指定文件是否将以内联方式显示或下载。有效值为 "inline""attachment"(默认值)。* :status - 指定与响应一起发送的状态代码。默认为 200。

通用数据下载

send_data buffer

下载动态生成的 tarball

send_data generate_tgz('dir'), filename: 'dir.tgz'

在浏览器中显示 Active Record 图像

send_data image.data, type: image.content_type, disposition: 'inline'

有关 HTTP Content-* 标头和缓存的更多信息,请参阅 send_file

# File actionpack/lib/action_controller/metal/data_streaming.rb, line 120
def send_data(data, options = {}) # :doc:
  send_file_headers! options
  render options.slice(:status, :content_type).merge(body: data)
end

send_file(path, options = {})

发送文件。这使用服务器适当的方法(例如 X-Sendfile)通过 Rack::Sendfile 中间件。要使用的标头通过 config.action_dispatch.x_sendfile_header 设置。您的服务器也可以通过设置 X-Sendfile-Type 标头为您配置它。

如果路径参数来自网页,请小心对其进行清理。send_file(params[:path]) 允许恶意用户下载服务器上的任何文件。

选项:* :filename - 建议浏览器使用的文件名。默认为 File.basename(path)。* :type - 指定 HTTP 内容类型。您可以为使用 Mime::Type.register 注册的类型指定字符串或符号,例如 :json。如果省略,类型将从 :filename 中指定的扩展名推断出来。如果扩展名没有注册内容类型,将使用默认类型 application/octet-stream。* :disposition - 指定文件是否将以内联方式显示或下载。有效值为 "inline""attachment"(默认值)。* :status - 指定与响应一起发送的状态代码。默认为 200。* :url_based_filename - 如果希望浏览器从 URL 推测文件名,则将其设置为 true,这对于某些浏览器上的 i18n 文件名是必要的(设置 :filename 会覆盖此选项)。

默认的 Content-TypeContent-Disposition 标头设置为在尽可能多的浏览器中下载任意二进制文件。已知 IE 版本 4、5、5.5 和 6 都有各种怪癖(尤其是在通过 SSL 下载时)。

简单下载

send_file '/path/to.zip'

在浏览器中显示 JPEG

send_file '/path/to.jpeg', type: 'image/jpeg', disposition: 'inline'

在浏览器中显示 404 页面

send_file '/path/to/404.html', type: 'text/html; charset=utf-8', disposition: 'inline', status: 404

您可以使用其他 Content-* HTTP 标头向客户端提供其他信息。有关 HTTP 标头的列表,请参阅 MDN https://mdn.org.cn/en-US/docs/Web/HTTP/Headers

还要注意,代理和浏览器可能会缓存文档。PragmaCache-Control 标头声明中间人如何缓存文件。它们默认为要求客户端在发布缓存的响应之前与服务器验证。有关 Web 缓存的概述,请参阅 www.mnot.net/cache_docs/,有关 Cache-Control 标头规范,请参阅 RFC 9111

# File actionpack/lib/action_controller/metal/data_streaming.rb, line 76
def send_file(path, options = {}) # :doc:
  raise MissingFile, "Cannot read file #{path}" unless File.file?(path) && File.readable?(path)

  options[:filename] ||= File.basename(path) unless options[:url_based_filename]
  send_file_headers! options

  self.status = options[:status] || 200
  self.content_type = options[:content_type] if options.key?(:content_type)
  response.send_file path
end