module ActionController::DataStreaming
Передача данных в Action Controller Streaming
Методы для отправки произвольных данных и потоковой передачи файлов в браузер вместо рендеринга.
Частные методы экземпляра
# 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.
# 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.