Я нахожусь в странной ситуации, когда send_file не может правильно отправить файл.Вот ситуация:
Версия Rail: 3.0.10 и 3.1.0 [две разные ветви для тестирования] Ruby: 1.9.2 на веб-сервере RVM: Apache with Passenger
У моего клиента есть документсистема управления;Я работал над его обновлением до Rails 3 (а теперь и rails 3.1) с Rails 2. Мы в основном перерабатывали систему, так как предыдущая была довольно старой.Все функции работают, кроме одной.Приложение позволяет пользователям загружать назначенные им документы.Когда пользователи входят в систему, они могут видеть, какие документы им назначены, и они могут загрузить.Работает отлично.Вот код, который работает:
send_file(document.file[:path],
:type => document.file[:content_type],:x_sendfile=>true, :filename=>document.name)
Есть один клиент, для которого они (мой клиент) сделали свое более раннее решение - отправить документ по запросу через веб-сервис на основе .NET (или что-то ещеназываться).Веб-служба аутентифицируется как пользователь, а затем перенаправляется на путь загрузки документа.Я могу сделать аутентификацию веб-службы, а затем перенаправить к действию контроллера, который загружает файлы, но это не работает.Журнал сервера говорит, что все в порядке:
Started GET "/download/12234" for 12.123.12.123 at 2011-09-20 23:21:24 -0400
Processing by DocumentController#download as HTML
Parameters: {"id"=>"12234"}
Sent file /yyy/zzz/abc/12234 (0.1ms)
Completed 200 OK in 138ms
Я изменил конкретные имена и IP-адреса.Обратите внимание, что IP-адрес (12.123.12.123) предназначен для сервера, на котором размещен веб-сервис.
Я был на связи с разработчиком, который разработал веб-сервис .NET, и он сказал, что он получает все заголовки правильно, за исключением того, чтодлина контента равна -1, и он не получает контента.Он сказал, что все остальные заголовки верны.
Чтобы решить проблему;Я пробовал несколько вариантов send_file, пытаясь установить все возможные параметры (x_sendfile, stream, disposition и т. Д.). Я также пытался установить заголовок:
response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate"
response.headers["Pragma"] = "no-cache"
response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT"
Но при использовании веб-службы для загрузки ничего не работаетфайл.Тем не менее, тот же метод работает непосредственно в браузере [я проверял, обходя аутентификацию в коде].
Я пытался использовать send_date, но он не работает:
File.open(document.file[:path], 'r') do |f|
send_data f.read, :type => document.file[:content_type], :filename => document.name, :disposition => 'inline'
end
В качестве обходного пути япопробовал redirect_to вместо отправки файла и использовал тестовый файл в общей папке, и это работает.Хотя небезопасно, но это, кажется, работает нормально.Единственная проблема заключается в том, что браузер теперь открывает документ, а не загружает его.
Пожалуйста, помогите мне.
Обновление: Проблема была связана с тем, что Rails теперь отправляет фрагментированный контент, а веб-служба ожидала его длины.