модуль ActionController::DataStreaming
Контроллер Действий Данные Streaming
Методы для отправки произвольных данных и потоковой передачи файлов в браузер вместо рендеринга.
Приватные методы экземпляра
# 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 Отправляет заданные двоичные данные в браузер. Этот метод аналогичен 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 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 Отправляет файл. Использует подходящий для сервера метод (например, 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, что необходимо для локализаций имён файлов в некоторых браузерах (установка :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
Можно использовать другие Content-* HTTP заголовки для предоставления дополнительной информации клиенту. См. MDN для списка HTTP заголовков.
Также следует учитывать, что документ может быть кэширован прокси-серверами и браузерами. Заголовки Pragma и Cache-Control определяют, как файл может быть кэширован посредниками. По умолчанию клиенты должны валидировать с сервером перед использованием кэшированных ответов. См. www.mnot.net/cache_docs/ для обзора кэширования веб-страниц и RFC 9111 для спецификации заголовка Cache-Control.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.