Rails send_file не отправляет данные при вызове через веб-сервис - PullRequest
0 голосов
/ 21 сентября 2011

Я нахожусь в странной ситуации, когда 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 теперь отправляет фрагментированный контент, а веб-служба ожидала его длины.

1 Ответ

1 голос
/ 24 сентября 2011

Это не было проблемой с send_file. Так был запрограммирован веб-сервис .NET. Ожидалось, что длина контента.

Существует изменение (между Rails 2 и Rails3) в поведении по умолчанию при отправке контента. Теперь это кусочный контент - поэтому длина контента не может быть.

Парень .NET изменил код, и теперь все работает нормально! Надеюсь, это кому-нибудь поможет.

...