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

时间:2013-08-04 23:53:35

标签: file file-upload upload limit dropzone.js

根据用例,我如何限制dropzone.js允许的文件数量?

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

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

13 个答案:

答案 0 :(得分:144)

我实现了这种方式略有不同。我只是在添加新文件时删除旧的删除文件。它可以覆盖文件,这是我在这里的用户体验。

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

答案 1 :(得分:68)

Nowell pointed it out that this has been addressed截至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>

答案 2 :(得分:61)

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

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

答案 3 :(得分:31)

maxFiles: 1完成这项工作,但如果您还想删除其他文件,则可以使用此示例代码取自Wiki page

如何限制文件数量?

  

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

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

答案 4 :(得分:3)

看起来maxFiles是您要查找的参数。

https://github.com/enyo/dropzone/blob/master/src/dropzone.coffee#L667

答案 5 :(得分:3)

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

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

答案 6 :(得分:2)

您可以通过更改dropezone.js

来限制上传的文件数量

Dropzone.prototype.defaultOptions = {       maxFiles:10, }

答案 7 :(得分:2)

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

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

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

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

答案 8 :(得分:1)

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

使用css禁用点击dropzone:

Third option

信用:这answer

答案 9 :(得分:0)

提供的解决方案的问题是您只能上传1个文件。在我的情况下,我需要一次只上传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;
            };
        }
    };

希望这会有所帮助;)

答案 10 :(得分:0)

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

答案 11 :(得分:0)

你也可以添加回调 - 这里我使用Dropzone for 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);
    }
}

答案 12 :(得分:-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);
        });
    }
};