跳至內容 跳至搜尋

Action Controller 資料 串流

用於發送任意資料和將檔案串流到瀏覽器的方法,而不是渲染。

方法
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 = {})

發送檔案。這會透過 Rack::Sendfile 中介軟體使用伺服器適用的方法(例如 X-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 HTTP 標頭列表

另請注意,文件可能會被代理伺服器和瀏覽器快取。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