Какой из них лучше всего подходит для потоковой передачи и загрузки файлов?
Пожалуйста, приведите примеры.
Какой из них лучше всего подходит для потоковой передачи и загрузки файлов?
Пожалуйста, приведите примеры.
send_data(_data_, options = {})
send_file(_path_, options = {})
Основное различие заключается в том, что вы передаете DATA (двоичный код или что-то еще) с send_datastrong > или файлом PATH с send_file.
Таким образом, вы можете сгенерировать некоторые данные и отправить их как встроенный текст или как вложение без создания файла на вашем сервере с помощью send_datastrong > . Или вы можете отправить готовый файл с помощью 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 )
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
присутствует X-Sendfile
, обратный прокси-сервер игнорирует большую часть текущего ответа и создает новый, который возвращает файл по указанному пути.
Client <---> Internet <---> Reverse proxy <---> Rails
Это гораздо более эффективно, поскольку обратный прокси-сервер очень специализирован для обслуживания статических файлов и может делать это намного быстрее, чем Rails (который не отправляет данные файла, если X-Sendfile
будет отправлен).
Типичный случай использования send_file
- это когда вы хотите контролировать права доступа к статическим файлам: вы не можете поместить их в /public
иначе они будут обработаны до того, как Rails сможет принять решение. Это обсуждается на странице: Защита содержимого public/в приложении Rails
Чтобы использовать заголовки X-Sendfile
, вы должны добавить:
config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
для config/initializers/production.rb
(или config/environment/production.rb
в Rails 5.x), а не application.rb
, поскольку в процессе разработки у вас нет прокси-сервера и вы хотите, чтобы send_file
действительно отправлял данные.
X-Sendfile
обсуждается в Руководстве по конвейеру активов.