Ruby On Rails - Показать страницу предварительной загрузки с таймером, начать загрузку в фоновом режиме после истечения времени таймера, а затем перенаправить в другое представление - PullRequest
0 голосов
/ 17 сентября 2018

Я уже посмотрел ответы на этот вопрос send_data - открыть файл в новом окне браузера? , но это не решает мою проблему.

У меня есть веб-сайт, на котором пользователь нажимает кнопку загрузки. После нажатия на кнопку его нужно перенаправить на страницу, где я покажу некоторую информацию, а также баннер с надписью, что загрузка начнется через N секунд. По истечении времени таймера файл будет загружен (не отображается). Затем текущая страница должна быть автоматически перенаправлена ​​на другую страницу «пост загрузки» в моем контроллере. Я столкнулся с проблемой реализации этого.

Что я уже сделал:

Я использую send_data с моего контроллера, чтобы отправить файл в виде двоичных данных в браузер и попросить загрузчик загрузить его вместо отображения.

send_data buffer, :filename => @organisation.id.to_s + '.key', :disposition => "attachment"

Я использую "target"="_blank", чтобы начать загрузку на новой странице.

<a href="#" target="_blank">I open in a new window.</a>

Можете ли вы предложить, как я могу достичь желаемого потока?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Спасибо, что нашли время!

Тем временем я решил проблему более простым способом.Взгляните:

* В моем контроллере: *

def generate_key

   ... LOGIC ...

send_data buffer, :filename => 'whatever.key', :disposition => "attachment", :type => 'text/plain'

end

На мой взгляд:

link_to 'Label', generate_key_organisation_path, target: "_blank"

0 голосов
/ 17 сентября 2018

Вот как я этого добился.

Вы не можете достичь этого, используя только два действия контроллера.Вам нужно как минимум три действия контроллера и немного Javascript на стороне клиента.

Вот что вам нужно сделать.

  1. Отобразить страницу предварительной загрузки, где вы показываете рекламу или детали, илиеще одна кнопка «Загрузить сейчас».
  2. С помощью страницы предварительной загрузки создайте таймер в javascript.Когда таймер истекает, с помощью java-скрипта откройте прямую ссылку для скачивания с целью, установленной как «_blank»

    window.open("https://example.com/direct_download_url" , "_blank");
    
  3. Используя java-скрипт, перенаправьте текущую страницу в «пост-загрузку»стр.

    window.location.href = "https://www.example.com/after_download_page";
    
  4. Используйте send_data с внесением как "attachment" в действии вашего контроллера для прямой загрузки

    send_data buffer, :filename => "file_name", :disposition => "attachment"
    

ЗдесьВот как будет выглядеть файл контроллера.

class DownloadsController < ApplicationController

  def pre_download_page

  end

  def direct_download
     #Your logic here
     #.......
     send_data buffer, :filename => "file_name", :disposition => "attachment"
  end

  def after_download_page

  end        
end

Вот как будет выглядеть View for pre_download_page

<script type="text/javascript">

  function startDirectDownload()
  {
     window.open("https://example.com/downloads/direct_download?file_id=12" , "_blank");
  }

  function redirectToAfterDownloadPage()
  {
     window.location.href = "https://www.example.com/downloads/after_download_page";
  }

  /*** If you want to start downloading after 10 seconds ***/
  setTimeout(function() {

     startDirectDownload();
     redirectToAfterDownloadPage();
  }, 10000);

  /** If you want the download to start immediately **/
  startDirectDownload();
  setTimeout(function() {
     redirectToAfterDownloadPage();
  },10000);

</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...