Rails 3, apache & пассажир, send_file отправляет файлы с нулевым байтом

Я борюсь с send_file с рельсами 3.0.9 с рубином 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

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

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

Мне удалось заставить его работать, убедившись, что 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 /