Подтвердить что ты не робот

Dropzone.js - как сделать что-то после загрузки файлов ALL

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

Dropzone.options.filedrop = {
    maxFilesize: 4096,
    init: function () {
        this.on("complete", function (file) {
            doSomething();
        });
    }
};

doSomething() будет вызываться для каждого загруженного файла. Как я могу вызвать функцию после загрузки всех файлов?

4b9b3361

Ответ 1

EDIT: Теперь существует queuecomplete событие, которое вы можете использовать именно для этой цели.


Предыдущий ответ:

Paul B. answer работает, но более простой способ сделать это - проверить, есть ли еще файлы в очереди или загрузка, когда файл завершается. Таким образом, вам не нужно самостоятельно отслеживать файлы:

Dropzone.options.filedrop = {
  init: function () {
    this.on("complete", function (file) {
      if (this.getUploadingFiles().length === 0 && this.getQueuedFiles().length === 0) {
        doSomething();
      }
    });
  }
};

Ответ 2

Просто используйте queuecomplete, что его там для и так просто. Проверьте документы http://www.dropzonejs.com/

queuecomplete > Вызывается, когда все файлы в очереди завершают загрузку.

      this.on("queuecomplete", function (file) {
          alert("All files have uploaded ");
      });

Ответ 3

Вероятно, есть способ (или три) сделать это... однако я вижу одну проблему с вашей целью: как вы знаете, когда все файлы были загружены? Перефразировать таким образом, чтобы иметь больше смысла... как вы знаете, что означает "все"? Согласно документации, init вызывается при инициализации самой Dropzone, а затем вы настраиваете обработчик события complete, чтобы что-то делать, когда каждый загруженный файл завершен. Но какой механизм предоставляет пользователю, чтобы программа могла знать, когда он сбросил все файлы, которые он намеревался сбросить? Если вы предполагаете, что он/она выполнит пакетное падение (то есть, бросьте на Dropzone 2-любое количество файлов одновременно, в одно действие), то следующий код может/возможно работать:

Dropzone.options.filedrop = {
    maxFilesize: 4096,
    init: function () {
        var totalFiles = 0,
            completeFiles = 0;
        this.on("addedfile", function (file) {
            totalFiles += 1;
        });
        this.on("removed file", function (file) {
            totalFiles -= 1;
        });
        this.on("complete", function (file) {
            completeFiles += 1;
            if (completeFiles === totalFiles) {
                doSomething();
            }
        });
    }
};

В принципе, вы смотрите в любое время, когда кто-то добавляет/удаляет файлы из Dropzone и сохраняет счет в переменных закрытия. Затем, когда каждая загрузка файла завершена, вы увеличиваете счетчик выполнения completeFiles var и видите, равен ли он теперь totalCount, который вы наблюдали и обновляли, когда пользователь размещал вещи в Dropzone. (Примечание: никогда не использовался плагин /JS lib., Поэтому лучше всего догадаться, что вы можете сделать, чтобы получить то, что хотите.)

Ответ 5

this.on("totaluploadprogress", function(totalBytes, totalBytesSent){


                    if(totalBytes == 100) {

                        //all done! call func here
                    }
                });

Ответ 6

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

myDropzone.on("totaluploadprogress", function(totalPercentage, totalBytesToBeSent, totalBytesSent ){
            if(totalPercentage >= 100 && totalBytesSent) {
                // All done! Call func here
            }
        });

Ответ 7

В дополнение к ответу @enyo при проверке файлов, которые все еще загружаются или находятся в очереди, я также создал новую функцию в dropzone.js для проверки любых файлов в состоянии ОШИБКИ (т.е. неправильный тип файла, размер и т.д.).

Dropzone.prototype.getErroredFiles = function () {
    var file, _i, _len, _ref, _results;
    _ref = this.files;
    _results = [];
    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
        file = _ref[_i];
        if (file.status === Dropzone.ERROR) {
            _results.push(file);
        }
    }
    return _results;
};

Таким образом, проверка будет выглядеть следующим образом:

  if (this.getUploadingFiles().length === 0 && this.getQueuedFiles().length === 0 && this.getErroredFiles().length === 0) {
    doSomething();
  }

Ответ 8

Я пытался работать с этими решениями, но это не сработало. Но позже я понял, что функция не была объявлена, поэтому я смотрю на страницу dropzone.com и беру пример для вызова событий. Поэтому, наконец, работайте на моем сайте. Для таких, как я, которые не очень хорошо разбираются в JavaScript, я оставляю вам пример.

<script type="text/javascript" src="/js/dropzone.js"></script>
<script type="text/javascript">
// This example uses jQuery so it creates the Dropzone, only when the DOM has
// loaded.

// Disabling autoDiscover, otherwise Dropzone will try to attach twice.
Dropzone.autoDiscover = false;
// or disable for specific dropzone:
// Dropzone.options.myDropzone = false;

$(function() {
  // Now that the DOM is fully loaded, create the dropzone, and setup the
  // event listeners
  var myDropzone = new Dropzone(".dropzone");

  myDropzone.on("queuecomplete", function(file, res) {
      if (myDropzone.files[0].status != Dropzone.SUCCESS ) {
          alert('yea baby');
      } else {
          alert('cry baby');

      }
  });
});
</script>