Spec-Zone.ru › Ruby on Rails 8.1

module ActionController::DataStreaming

Подключенные модули:
ActionController::Rendering

Передача данных в Action Controller Streaming

Методы для отправки произвольных данных и потоковой передачи файлов в браузер вместо рендеринга.

Частные методы экземпляра

send_data (data, options = {}) Показать исходный код
# File actionpack/lib/action_controller/metal/data_streaming.rb, line 122
def send_data(data, options = {}) # :doc:
  send_file_headers! options
  render options.slice(:status, :content_type).merge(body: data)
end

Отправляет указанные двоичные данные в браузер. Этот метод похож на 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.

send_file (path, options = {}) Показать исходный код
# File actionpack/lib/action_controller/metal/data_streaming.rb, line 77
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

Отправляет файл. Для этого используется подходящий серверу метод (например, 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 — задайте значение true, если хотите, чтобы браузер определял имя файла по URL. Это необходимо для имен файлов с символами интернационализации в некоторых браузерах (установка :filename переопределяет этот параметр).

Заголовки Content-Type и Content-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

Чтобы предоставить клиенту дополнительную информацию, можно использовать другие заголовки HTTP Content-*. См. список заголовков HTTP на сайте MDN: список заголовков HTTP.

Также имейте в виду, что документ может кэшироваться прокси-серверами и браузерами. Заголовки Pragma и Cache-Control определяют, как файл может кэшироваться промежуточными узлами. По умолчанию они требуют от клиентов проверить данные на сервере, прежде чем отправлять кэшированные ответы. Обзор веб-кэширования см. на сайте www.mnot.net/cache_docs/, а спецификацию заголовка Cache-Control — в документе RFC 9111.

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API