Rails 3 и plupload - как я могу сделать перенаправление после загрузки? - PullRequest
1 голос
/ 17 января 2012

Когда я загружаю файл с помощью plupload с помощью кода ниже, поэтому в консоли Firebug я вижу сообщение POST / uploads 200 OK 8192ms .Цвет текста красный.Когда я смотрю на вывод терминала, Завершено 200 OK в 7653мс .

var uploader = new plupload.Uploader({
    runtimes: 'gears,html5,flash,silverlight,browserplus',
    browse_button: 'pickfiles',    
    autostart : true,    
    max_file_size: '10mb',
    url: '/uploads',
    resize: { width: 320, height: 240, quality: 90 },
    flash_swf_url: '/Scripts/pl/plupload.flash.swf',
    silverlight_xap_url: '/Scripts/pl/plupload.silverlight.xap',
    filters: [
    { title: "Image files", extensions: "jpg,gif,png" },
    { title: "Zip files", extensions: "zip" }
]
});
uploader.bind('Init', function (up, params) {
    $('#filelist')[0].innerHTML = "<div>Current runtime: " + params.runtime + "</div>";
});
uploader.bind('Error', function (up, err) {
    $('#filelist').append("<div>Error: " + err.code +
        ", Message: " + err.message +
        (err.file ? ", File: " + err.file.name : "") +
        "</div>"
    );

});
uploader.bind('FilesAdded', function (up, files) {
    for (var i in files) {
        $('#filelist')[0].innerHTML += '<div id="' + files[i].id + '">' + files[i].name + ' (' + plupload.formatSize(files[i].size) + ') <b></b></div>';
    }
    //uploader.start();
});
$('#uploadfiles').click(function (e) {
    uploader.start();
    e.preventDefault();
});

uploader.bind('UploadProgress', function (up, file) {
    $('#' + file.id)[0].getElementsByTagName('b')[0].innerHTML = '<span>' + file.percent + "%</span>";
});

uploader.init();

В контроллере Uploads действие create выглядит так:

  def create
    @upload = Upload.new(:upload => params[:file])

    if @upload.save
      head 200
      #redirect_to '/users'
    else
      render :action => "new"
    end
  end

Как мне сделать перенаправление на любую страницу?Как можно видеть, я попытался сделать редирект после завершения загрузки на страницу пользователей , но, к сожалению, ничего не произошло.Если в действии create есть строка head 200, так что ничего не произошло.

Может ли кто-нибудь помочь мне, пожалуйста, как я могу сделать перенаправление на любую другую страницу после завершения загрузки?Я попытался выполнить поиск в Google, но я не нашел способа сделать это ...

И я хотел бы еще спросить вас - почему в консоли Firebug всегда есть после загруженного файла строка POST / uploads 200 OK без каких-либо сообщений в журнале?

Ответы [ 4 ]

2 голосов
/ 17 мая 2013

Я могу просто сделать это с помощью функции window.location javascript.Plupload имеет событие uploadcomplete , которое генерируется после завершения загрузки всех файлов.Событие FileUploaded генерируется после одной загрузки файла.Так что событие uploadcomplete полезно, если вы хотите загрузить несколько файлов. Идея загрузки взята из здесь и добавлено событие завершения загрузки.Вот мой загрузчик.

<script type="text/javascript">
 $(function(){
  var uploader = new plupload.Uploader({
   runtimes : "html5",
   browse_button : 'pickfiles',
   max_file_size : '100mb',
   url : "/documents",
   multipart: true,
   multipart_params: {
   "authenticity_token" : '<%= form_authenticity_token %>'
  }
});

 uploader.bind('FilesAdded', function(up, files) {
  $.each(files, function(i, file) {
  $('#filelist').append(
    '<div id="' + file.id + '">' +
    'File: ' + file.name + ' (' + plupload.formatSize(file.size) + ') <b></b>'

    );

  });


   });

  uploader.bind('UploadProgress', function(up, file) {    

$('#' + file.id + " b").html(file.percent + "%");


  });

  uploader.bind('UploadComplete', function(up, files) {
  window.location = '/documents';
 });


  $('#uploadfiles').click(function(e) {
  uploader.start();
  e.preventDefault();
  });


  uploader.init();


  });


  </script>

После завершения загрузки загрузчик перенаправляет на список всех загруженных документов.

1 голос
/ 17 января 2012

Два варианта:

1) Plupload имеет обратный вызов FileUploaded, который вы можете использовать:

uploader.bind('FileUploaded', function(up, file, info) {
  // Redirect after successful upload
  window.location = 'http://mysite.com/users';
});

2) Вы также можете просто позволить Rails выполнить перенаправление, поместив этот код в ApplicationController:

  # Allows redirecting for AJAX calls as well as normal calls
  def redirect_to(options = {}, response_status = {})
    if request.xhr?
      render(:update) {|page| page.redirect_to(options)}
    else
      super(options, response_status)
    end
  end
0 голосов
/ 29 января 2013

Я знаю, что это немного старо, но я хочу улучшить ответы.Основываясь на том, что сказал @gonchuki, я сделал это в своем представлении:

uploader.bind('FileUploaded', function(up, file, info) {
  window.location = info.response;
});

И в своем контроллере я просто отображаю URL с простым текстом:

def create
  # do stuff here
  render :text => object_path(id: object)
end

Надеюсь, эта помощь тоже:)

0 голосов
/ 18 января 2012

Вы не можете выполнить перенаправление таким образом, поскольку выгрузка файлов с любым временем выполнения загрузки является косвенным действием . HTML5 использует XHR, HTML4 использует прокси-фрейм iframe, а flash / silverlight используют свои встроенные API потоковой передачи байтов для выполнения загрузки.

Если вы загружаете только один файл за раз, единственный вариант - использовать событие FileUploaded. Третий параметр заполняется ответом сервера из всех сред выполнения. Вы бы на самом деле использовали его так (отредактировано copypasta от iWasRobbed):

uploader.bind('FileUploaded', function(up, file, info) {
  // Redirect after successful upload
  window.location = info.response;
});

ответ будет всегда простым текстом, учитывая, что это единственная вещь, которую plupload может стандартизировать для нескольких различных сред выполнения, поэтому ваш URL-адрес перенаправления должен быть в теле ответа. Если вам нужны более сложные ответы, вы всегда можете отправить сериализованный JSON и проанализировать его на стороне клиента.

...