web-dev-qa-db-fra.com

dropzone.js - comment faire quelque chose après le téléchargement de TOUS les fichiers

J'utilise dropzone.js pour ma solution de téléchargement de fichiers par glisser-déposer. Je suis coincé à quelque chose où je dois appeler une fonction après tout les fichiers sont téléchargés Dans ce cas,

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

doQuelque chose () sera appelé pour chaque fichier téléchargé. Comment puis-je appeler une fonction après le téléchargement de tous les fichiers?

48
Kemal Emin

EDIT: Il existe maintenant un événement queuecomplete que vous pouvez utiliser exactement à cette fin.


_ {Réponse précédente: _

La réponse de Paul B. fonctionne, mais une façon plus simple de le faire est de vérifier s'il reste des fichiers dans la file d'attente ou de la télécharger chaque fois qu'un fichier se termine. De cette façon, vous n’avez pas à suivre les fichiers vous-même:

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

Il suffit d’utiliser queuecomplete, c’est la raison pour laquelle il est là et si simple. Consultez la documentation http://www.dropzonejs.com/

queuecomplete> Appelé lorsque le téléchargement de tous les fichiers de la file d'attente est terminé.

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

Il y a probablement un moyen (ou trois) de le faire ... cependant, je vois un problème avec votre objectif: comment savoir quand tous les fichiers ont été téléchargés? Pour reformuler d'une manière qui a plus de sens ... comment savez-vous ce que "tout" signifie? Selon la documentation, init est appelé lors de l'initialisation de Dropzone, puis vous configurez le gestionnaire d'événements complete pour qu'il fasse quelque chose lorsque chaque fichier téléchargé est terminé. Mais quel mécanisme donne-t-on à l'utilisateur pour permettre au programme de savoir quand il a abandonné tous les fichiers qu'il avait l'intention de supprimer? Si vous supposez qu'il effectuera une suppression par lots (c'est-à-dire, déposez-le sur Dropzone 2, quel que soit le nombre de fichiers, en une fois, en une seule action), le code suivant pourrait/pourrait éventuellement fonctionner:

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();
            }
        });
    }
};

Fondamentalement, vous surveillez chaque fois que quelqu'un ajoute/supprime des fichiers de Dropzone, et gardez un compte dans les variables de fermeture. Ensuite, lorsque chaque téléchargement de fichier est terminé, vous incrémentez le compteur completeFiles progress, et voyez s'il correspond maintenant au totalCount que vous avez surveillé et mis à jour lorsque l'utilisateur a placé des éléments dans Dropzone. (Remarque: n'a jamais utilisé le plug-in/JS lib., Il est donc préférable de deviner ce que vous pourriez faire pour obtenir ce que vous voulez.)

11

Un événement 'queuecomplete' a été ajouté. Voir numéro 317 .

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


                    if(totalBytes == 100) {

                        //all done! call func here
                    }
                });
3
Ansell Cruz

Je vous ai voté parce que votre méthode est simple. Je n'ai apporté que quelques légères modifications, car parfois l'événement est déclenché même s'il n'y a pas d'octets à envoyer - sur ma machine, il l'a fait lorsque j'ai cliqué sur le bouton Supprimer d'un fichier.

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

En plus de la réponse de @ enyo lors de la recherche de fichiers en cours de téléchargement ou dans la file d'attente, j'ai également créé une nouvelle fonction dans dropzone.js afin de rechercher les fichiers dans un état ERROR (type, taille, etc.).

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;
};

Et ainsi, le chèque deviendrait:

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

J'essayais de travailler avec ces solutions, mais cela ne fonctionnait pas… .. Mais plus tard, j'ai réalisé que la fonction n'était pas déclarée, aussi je surveille la page dropzone.com et prends l'exemple pour appeler des événements… __.Alors enfin travailler sur mon site . Pour ceux comme moi qui ne comprennent pas très bien JavaScript, je vous laisse l'exemple.

<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>
0
Marcexl

La réponse acceptée n'est pas nécessairement correcte. queuecomplete sera appelé même si le fichier sélectionné est plus grand que la taille maximale du fichier.

L'événement à utiliser est successmultiple ou completemultiple.

Référence: http://www.dropzonejs.com/#event-successmultiple

0