Який із них найкращий для потокового передавання та завантаження файлів?
Наведіть приклади.
Який із них найкращий для потокового передавання та завантаження файлів?
Наведіть приклади.
Відповіді:
send_data(_data_, options = {})
send_file(_path_, options = {})
Основна відмінність тут полягає в тому, що ви передаєте DATA (двійковий код або інший) за допомогою send_data або файл PATH за допомогою send_file .
Таким чином, ви можете генерувати деякі дані та надсилати їх як вбудований текст або як вкладення, не створюючи файл на своєму сервері за допомогою send_data . Або ви можете надіслати готовий файл за допомогою send_file
data = "Hello World!"
send_data( data, :filename => "my_file.txt" )
Або
data = "Hello World!"
file = "my_file.txt"
File.open(file, "w"){ |f| f << data }
send_file( file )
Для виконання краще створити файл один раз, а потім надіслати його скільки завгодно разів. Так send_file
підійде краще.
Для потокового передавання, наскільки я розумію, обидва ці методи використовують однаковий набір опцій та налаштувань, тому ви можете використовувати X-Send або інший спосіб.
UPD
send_data та збережіть файл:
data = "Hello World!"
file = "my_file.txt"
File.open(file, "w"){ |f| f << data }
send_data( data )
{ |f| f << data }
.
send_file
мені довелося використовувати сам файл, а не шлях, щоб змусити його працювати. Просто хотів оновити на випадок, якщо інші стикаються з цим?
send_file може бути швидшим, ніж send_data
Як згадував fl00r , send_file
бере шлях і send_data
дані.
Тому send_file
це підмножина send_data
, оскільки вам потрібен файл у файловій системі: ви, звичайно, можете просто прочитати файл і використовувати send_data
на ньому. Але це send_file
може бути і швидше, тому це компроміс між продуктивністю та загальністю.
send_file
може бути швидшим, оскільки він може надсилати X-Sendfile
заголовок на Apache ( X-Accel-Redirect
на Nginx) замість вмісту файлу, оскільки він знає шлях.
Цей заголовок споживається зворотним проксі (Apache або Nginx), який зазвичай працює перед Rails у виробничій установці.
Якщо X-Sendfile
у відповіді присутній, зворотний проксі ігнорує більшу частину поточної відповіді та створює новий, який повертає файл за вказаним шляхом.
Client <---> Internet <---> Reverse proxy <---> Rails
Це набагато ефективніше, оскільки зворотний проксі спеціалізується на обслуговуванні статичних файлів і може робити це набагато швидше, ніж Rails (який не надсилає дані файлу, якщо X-Sendfile
буде надіслано).
Типовий випадок використання send_file
- це коли ви хочете контролювати дозвіл на доступ до статичних файлів: ви не можете розміщувати їх під ними, /public
інакше вони будуть отримуватись до того, як Rails зможе прийняти рішення. Про це йдеться у: Захист загальнодоступного вмісту / у програмі Rails
Для того, щоб використовувати X-Sendfile
заголовки, потрібно додати:
config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
to config/initializers/production.rb
(або config/environment/production.rb
в Rails 5.x), ні application.rb
, оскільки у розробці у вас немає проксі-сервера, і ви хочете send_file
фактично надіслати дані.
X-Sendfile
обговорюється в Посібнику трубопроводу активів .