Rails 3, apache & passenger, send_file отправляет файлы нулевого байта - PullRequest
13 голосов
/ 08 августа 2011

Я борюсь с send_file с рельсами 3.0.9 под управлением ruby ​​1.9, пассажир 3.0.8 на apache на ubuntu lucid Модуль xsendfile установлен и загружен в apache

root~# a2enmod xsendfile
Module xsendfile already enabled

Его символическая ссылка правильнов модах с поддержкой

lrwxrwxrwx 1 root root   32 Aug  8 11:20 xsendfile.load -> ../mods-available/xsendfile.load

config.action_dispatch.x_sendfile_header = "X-Sendfile" установлено в моем production.rb

с использованием send_file приводит к отправке файлов нулевого байта в браузер

filepath = Rails.root.join('export',"#{filename}.csv")
if File.exists?(filepath)
  send_file filepath, :type => 'text/csv'
end

1 Ответ

11 голосов
/ 09 сентября 2011

Я полагаю, что предыдущий ответ - неправильный путь, потому что, насколько я могу судить, Apache вообще не обрабатывает загрузки, когда применяется это решение, вместо этого идет процесс rails.Вот почему появляется директива nginx, которая не должна работать.Вы получаете тот же результат, комментируя директиву config.

Еще один недостаток (помимо слишком длительного связывания процесса rails) заключается в том, что когда потоковая передача данных обрабатывается процессом rails, ответ, похоже, не отправляет заголовок длины содержимого.Таким образом, пользователь не знает, насколько велик загружаемый файл и сколько времени это займет (проблема с юзабилити).

Я смог заставить его работать, убедившись, что mod_sendfile был правильно включени загружается в мою конфигурацию apache, вот так (это будет зависеть от вашей установки apache и т. д.):

LoadModule xsendfile_module   /usr/lib64/httpd/modules/mod_xsendfile.so
...

# enable mod_x_sendfile for offloading zip file downloads from rails 
XSendFile on 
XSendFilePath /
...