如何限制上传的dropzone.js文件的数量?


78

根据使用情况,如何限制dropzone.js允许的文件数量?

例如,我可能只需要上传1个,2个或4个文件。

不是uploadMultiple。不幸的是,uploadMultiple仅适用于每个请求处理的文件数。


1
使用maxFiles。这将有所帮助
Uday Hiwarale

其实maxFiles就是这个问题的答案,无需编写更多代码。谢谢。
deepcell

Answers:


160

我实现了这种方式略有不同。只要添加新文件,我就删除旧的已删除文件。它充当了覆盖文件的角色,而这正是我想要的用户体验。

Dropzone.options.myAwesomeDropzone = {
  accept: function(file, done) {
    console.log("uploaded");
    done();
  },
  init: function() {
    this.on("addedfile", function() {
      if (this.files[1]!=null){
        this.removeFile(this.files[0]);
      }
    });
  }
};

4
这真的很好。其他答案没有。您也可以在accept函数中直接执行相同的工作。this.files也在那里存在。这会缩短代码一点。
汤姆(Tom)

将代码放在dropzone.js或html代码放在哪里的位置

1
这是一个很好的答案,可以回答另一个问题(如何覆盖以前上传的文件)。
罗莎

在尝试了其他答案之后,the是唯一完全按照我的方式工作的答案。应该接受的答案,恕我直言。
jszobody

1
对于我来说,在当前的Chrome浏览器中,files [1]undefined是只有一个文件的情况,因此if条件始终返回true。也许只是改变为if (this.files[1])
2016年

77

Nowell指出,此问题已于2013年8月6日得到解决。使用此表单的工作示例可能是:

<form class="dropzone" id="my-awesome-dropzone"></form>

您可以使用以下JavaScript:

Dropzone.options.myAwesomeDropzone = {
  maxFiles: 1,
  accept: function(file, done) {
    console.log("uploaded");
    done();
  },
  init: function() {
    this.on("maxfilesexceeded", function(file){
        alert("No more files please!");
    });
  }
};

dropzone元素甚至具有特殊的样式,因此您可以执行以下操作:

<style>
  .dz-max-files-reached {background-color: red};
</style>

不是<form class="dropzone" id="myAwesomeDropzone"></form>吗?
MK Yung

2
@MKYung我知道事实已经过去了将近一年,但是id是由Dropzone提取的,而enyo为您提供了骆驼保护套。因此调用它要容易得多。(起初显然有点令人困惑……但是它确实有效,所以我没有抱怨。)
Cayce K 2014年

2
添加一个文件,然后添加下一个文件,效果很好。虽然,如果您在计算机上选择了多个文件并将它们全部拖到dropzone表单中,则会添加所有文件。如何预防呢?
trs 2015年

71

我认为最直观的单个文件上传过程是在新条目上替换以前的文件。

  $(".drop-image").dropzone({
    url: '/cart?upload-engraving=true',
    maxFiles: 1,
    maxfilesexceeded: function(file) {
        this.removeAllFiles();
        this.addFile(file);
    }
})

2
这对我不起作用-但@oneirois的其他答案可以。
罗伯特·多德

谢谢您的提示,这就是我要寻找的。另外,如果适用,也不要忘记维护文件服务器端(即:删除先前的文件)。
Pierre de LESPINAY 2015年

当autoProcessQueue为false时,这不起作用。但是,它将在maxFiles为0且autoProcessQueue为false时触发。这一定是一个错误。
Daantje '16

2
对我来说工作非常好,并且同意这是最直观的单个文件上传过程:)
zachu 2016年

+1对于最终用户,此答案是更好的解决方案。使用init: function(){ this.on('maxfilesexceeded', function(file){ this.removeAllFiles(); this.addFile(file); }); }选项即使在添加了选项的情况下也可以很好地在我的项目中使用autoProcessQueue: false
RNickMcCandless

34

maxFiles: 1做这项工作,但是如果您还想删除其他文件,则可以使用从Wiki页面获取的以下示例代码:

如何限制文件数量?

你真幸运!从3.7.0版开始,Dropzone支持maxFiles选项。只需将其设置为所需的数量,就可以了。如果您不希望查看被拒绝的文件,只需注册maxfilesexceeded事件,然后立即删除文件:

myDropzone.on("maxfilesexceeded", function(file)
{
    this.removeFile(file);
});

2
这么低估的答案。
Saad Suri

9

对我来说非常有效的替代解决方案:

init: function() {
    this.on("addedfile", function(event) {
        while (this.files.length > this.options.maxFiles) {
            this.removeFile(this.files[0]);
        }
    });
}



2

1-set maxFiles计数“ maxFiles:1” 2-在maxfilesexededed事件中清除所有文件并添加新文件

事件:调用每个因文件数超过maxFiles限制而被拒绝的文件。

    var myDropzone = new Dropzone("div#yourDropzoneID", { url: "/file/post", 
 uploadMultiple: false, maxFiles: 1 });

myDropzone.on("maxfilesexceeded", function (file) {
    myDropzone.removeAllFiles();
    myDropzone.addFile(file);
});

1

为什么不只使用CSS来禁用click事件。当达到最大文件数时,Dropzone将自动添加一个dz-max-files-reached类。

使用CSS禁用对dropzone的单击:

.dz-max-files-reached {
          pointer-events: none;
          cursor: default;
}

信用:这个答案


0

提供的解决方案的问题在于,您只能上传1个文件。就我而言,一次只需要上传一个文件(单击或拖放)。

这是我的解决方案。

    Dropzone.options.myDropzone = {
        maxFiles: 2,
        init: function() {
            this.handleFiles = function(files) {
                var file, _i, _len, _results;
                _results = [];
                for (_i = 0, _len = files.length; _i < _len; _i++) {
                    file = files[_i];
                    _results.push(this.addFile(file));
                    // Make sure we don't handle more files than requested
                    if (this.options.maxFiles != null && this.options.maxFiles > 0 && _i >= (this.options.maxFiles - 1)) {
                        break;
                    }
                }
                return _results;
            };
            this._addFilesFromItems = function(items) {
                var entry, item, _i, _len, _results;
                _results = [];
                for (_i = 0, _len = items.length; _i < _len; _i++) {
                    item = items[_i];
                    if ((item.webkitGetAsEntry != null) && (entry = item.webkitGetAsEntry())) {
                        if (entry.isFile) {
                            _results.push(this.addFile(item.getAsFile()));
                        } else if (entry.isDirectory) {
                            _results.push(this._addFilesFromDirectory(entry, entry.name));
                        } else {
                            _results.push(void 0);
                        }
                    } else if (item.getAsFile != null) {
                        if ((item.kind == null) || item.kind === "file") {
                            _results.push(this.addFile(item.getAsFile()));
                        } else {
                            _results.push(void 0);
                        }
                    } else {
                        _results.push(void 0);
                    }
                    // Make sure we don't handle more files than requested
                    if (this.options.maxFiles != null && this.options.maxFiles > 0 && _i >= (this.options.maxFiles - 1)) {
                        break;
                    }
                }
                return _results;
            };
        }
    };

希望这可以帮助 ;)


0

我想指出。但是,也许这只是发生在我身上,但是,当我在dropzone中使用this.removeAllFiles()时,它会触发事件COMPLETE并发出打击,我所做的就是检查fileData是否为空,以便我可以实际提交表单。


0

您还可以添加回调-在这里我将Dropzone用于Angular

dzCallbacks = {
    'addedfile' : function(file){
        $scope.btSend = false;
        $scope.form.logoFile = file;
    },
    'success' : function(file, xhr){
        $scope.btSend = true;
        console.log(file, xhr);
    },
    'maxfilesexceeded': function(file) {
         $timeout(function() { 
            file._removeLink.click();
        }, 2000);
    }
}

-1
Dropzone.options.dpzSingleFile = {
    paramName: "file", // The name that will be used to transfer the file
    maxFiles: 1,
    init: function() {
        this.on("maxfilesexceeded", function(file) {
            this.removeAllFiles();
            this.addFile(file);
        });
    }
};
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.