модуль ActionController::DataStreaming
Методы для отправки произвольных данных и потоковой передачи файлов в браузер вместо рендеринга.
Защищенные методы экземпляра
Отправляет заданные двоичные данные в браузер. Этот метод похож на 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-* и кэшировании.
# File actionpack/lib/action_controller/metal/data_streaming.rb, line 127
def send_data(data, options = {}) #:doc:
send_file_headers! options
render options.slice(:status, :content_type).merge(:text => data)
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-адреса, что необходимо для имен файлов с 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.
# File actionpack/lib/action_controller/metal/data_streaming.rb, line 67
def send_file(path, options = {}) #:doc:
raise MissingFile, "Cannot read file #{path}" unless File.file?(path) and 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)
self.response_body = FileBody.new(path)
end
© 2004–2016 David Heinemeier Hansson
Licensed under the MIT License.