Ruby On Rails: send_file через запрос jquery/ajax

У меня проблемы с загрузкой файлов с моего сервера rails через ajax:

У меня есть действие show в моем контроллере загрузок, которое вызывает send_file, если параметр передается действию show.

Затем у меня есть страница, на которой есть раскрывающийся список select, в котором отображается список файлов, находящихся на сервере. Когда я выбираю значение и нажимаю кнопку загрузки, он выдает запрос ajax, который отправляет запрос GET, который обрабатывается моим контроллером загрузки.

Глядя на журналы моего сервера, кажется, что запрос ajax работает, и он говорит:

Started GET "/download?file=test.txt" for 127.0.0.1 at 2012-07-19 15:13:41 -0700
Processing by DownloadsController#show as HTML
  Parameters: {"file"=>"test.txt"}
Sent file /Users/Admin/Documents/rails_projects/test/public/data/test.txt (0.1ms)
Completed 200 OK in 0ms (ActiveRecord: 0.0ms)

Однако на самом деле ничего не загружается. Когда я действительно посещаю страницу show вручную, файл фактически загружается. Что я делаю не так?

--

Javascript

 <script type="text/javascript">
    $(function() {
      $('#button').click(function() {
        var s = $("select#dropdown_select").val();
               $.ajax({
                      type: 'GET',
                      url: 'http://localhost:3000/download?file=' + s,
                      dataType: "HTML"
                      });
      })
    });
  </script>

Контроллер загрузок

def show

    filename = params[:dl]

    if(filename.nil? == false)

    path = Rails.root.join('public/data', filename)
    send_file path, :x_sendfile => true

    end
end

person rhfannnn    schedule 19.07.2012    source источник
comment
вы не можете загрузить файл с помощью ajax, вы должны разрешить пользователю отправлять форму (с выбранным вами упоминанием) и разрешить браузеру обрабатывать запрос и ответ   -  person lisowski.r    schedule 20.07.2012


Ответы (1)


У меня была такая же проблема, ну вроде как, но вместо использования функции щелчка JS я использовал тег rails link.

Первоначально в моем представлении у меня был тег link_to с remote: true (который производит вызов ajax)

Ссылка указывала на действие, в результате которого был создан PDF-файл. PDF-файл был сгенерирован (с креветками и тонкими отчетами) и отправлен, но диалоговое окно загрузки не появилось.

Поэтому я удаляю remote: true и добавляю target: '_self', так что получилось вот так (я использую haml)

!= link_to image_tag( 'print.png' ) + (I18n.t :buttons)[:comments][:print],
    customer_comment_path(@address_book),
    { target: '_self' }

И это сработало просто отлично.

Почему бы вам не попробовать переписать код, используя теги Rail link?

person OfficeYA Virtual Offices    schedule 01.11.2012