Spec-Zone.ru › Ruby on Rails 5.2

модуль ActionController::DataStreaming

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

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

Приватные методы экземпляра

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

Загрузка динамически сгенерированного архива tar:

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

Отображение изображения Active Record в браузере:

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

См. send_file для получения дополнительной информации об HTTP заголовках Content-* и кэшировании.

send_file(path, options = {}) Показать исходный код
# File actionpack/lib/action_controller/metal/data_streaming.rb, line 68
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) через middleware 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, что необходимо для i18n имён файлов в некоторых браузерах (установка :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', status: 404

Узнайте о других заголовках Content-* HTTP, если вы хотите предоставить пользователю больше информации (например, Content-Description) в www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11.

Также обратите внимание, что документ может кэшироваться прокси-серверами и браузерами. Заголовки Pragma и Cache-Control определяют, как файл может кэшироваться посредниками. По умолчанию они требуют, чтобы клиенты подтверждали с сервером перед освобождением кэшированных ответов. См. www.mnot.net/cache_docs/ для обзора веб-кэширования и www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9 для спецификации заголовка Cache-Control.

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

Spec-Zone.ru

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