【问题标题】:dropzone.js - how to do something after ALL files are uploadeddropzone.js - 上传所有文件后如何做某事
【发布时间】:2013-06-04 14:32:30
【问题描述】:

我正在使用 dropzone.js 作为我的拖放文件上传解决方案。我被困在需要在所有文件上传后调用函数的地方。在这种情况下,

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

doSomething() 将为每个已上传的文件调用。上传完所有文件后如何调用函数?

【问题讨论】:

    标签: javascript jquery dropzone.js


    【解决方案1】:

    可能有一种(或三种)方法可以做到这一点...但是,我发现您的目标存在一个问题:您如何知道所有文件何时已上传?以更有意义的方式重新表述......你怎么知道“全部”是什么意思?根据文档,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 进度计数器变量,看看它现在是否等于用户在 Dropzone 中放置东西时您一直在观察和更新的 totalCount。 (注意:从未使用过插件/JS 库,所以这是最好的猜测,你可以做些什么来得到你想要的。)

    【讨论】:

    • 酷,我也想到了一个计数器,但是我对变量的范围以及它的存活时间等感到困惑,
    • 在 totalFiles 已经为 0 时添加另一个条件,否则您可能会得到负的 totalFiles 值。
    【解决方案2】:

    编辑:现在有一个 queuecomplete 事件,您可以将其用于此目的。


    上一个答案:

    Paul B.'s answer 有效,但更简单的方法是检查队列中是否仍有文件或在文件完成时上传。这样您就不必自己跟踪文件:

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

    【讨论】:

    • @Emin 很公平 :) 实际上,这很好,b/c 这是更好的解决方案。并更好地利用 API。
    • 我想补充一点,同时还有一个名为 queuecomplete 的额外事件会在队列完成上传时触发。
    • 另外,不要忘记检查任何处于错误状态的文件(即错误的文件类型、大小等)。请参阅下面的我的答案,以获取检查该问题的新功能。
    • 仅供参考,即使上传的文件由于服务器端验证错误而被拒绝,queuecomplete 的“上传完成”也会触发,因此它与确保上传的文件不同文件实际上是成功的。
    • 像魅力一样工作!
    【解决方案3】:
    this.on("totaluploadprogress", function(totalBytes, totalBytesSent){
    
    
                        if(totalBytes == 100) {
    
                            //all done! call func here
                        }
                    });
    

    【讨论】:

      【解决方案4】:

      已添加“队列完成”事件。见Issue 317

      【讨论】:

        【解决方案5】:

        我赞成你,因为你的方法很简单。我确实只做了一些轻微的修改,因为有时即使没有要发送的字节也会触发事件 - 在我的机器上,当我单击文件上的删除按钮时它会这样做。

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

        【讨论】:

          【解决方案6】:

          除了@enyo 在检查仍在上传或在队列中的文件的答案之外,我还在 dropzone.js 中创建了一个新函数来检查任何处于 ERROR 状态的文件(即错误的文件类型、大小等)。

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

          【讨论】:

            【解决方案7】:

            只需使用 queuecomplete,这就是它的用途,而且非常简单。查看文档http://www.dropzonejs.com/

            queuecomplete > 当队列中的所有文件完成上传时调用。

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

            【讨论】:

            • 有谁知道这是否应该为队列中的每个文件触发?这就是我正在经历的行为。
            • 对于使用 dropzone 5.3 的我来说,它会在队列清空后触发一次(也就是所有文件都已上传)
            【解决方案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>
            

            【讨论】:

            • 你应该反转测试条件: if (myDropzone.files[0].status != Dropzone.SUCCESS ) THEN alert('cry baby'); ELSE alert('yeah baby');
            【解决方案9】:

            接受的答案不一定正确。 queuecomplete 即使选择的文件大于最大文件大小也会被调用。

            要使用的正确事件是successmultiplecompletemultiple

            参考: http://www.dropzonejs.com/#event-successmultiple

            【讨论】:

            • 在选择接受的答案时,queuecomplete 事件还不存在。
            • @Gerben 我的意思是queuecompleted 不是最合适的事件。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-08-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-16
            • 2013-09-09
            • 2015-10-11
            相关资源
            最近更新 更多