Rails send_file не отправляет данные при вызове через веб-сервис
Я нахожусь в странной ситуации, когда 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, поток, расположение и т. Д.).. Я также попытался установить заголовок:
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 теперь отправляет фрагментированный контент, а веб-сервис ожидает длину контента.
1 ответ
Это не было проблемой с send_file. Так был запрограммирован веб-сервис.NET. Ожидал, что длина контента.
Существует изменение (между Rails 2 и Rails3) в поведении по умолчанию при отправке контента. Теперь это кусочный контент - поэтому не может быть длины контента.
Парень.NET изменил код, и теперь все работает нормально! Надеюсь, это кому-нибудь поможет.