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

Posted

技术标签:

【中文标题】如何限制上传的 dropzone.js 文件的数量?【英文标题】:How to limit the number of dropzone.js files uploaded? 【发布时间】:2013-08-05 14:36:55 【问题描述】:

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

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

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

【问题讨论】:

使用 maxFiles。这会有所帮助 其实maxFiles就是这个问题的答案,不用多写代码。谢谢。 【参考方案1】:

我以稍微不同的方式实现了这一点。每当添加新文件时,我都会删除旧的删除文件。它充当覆盖文件,这是我在这里想要的用户体验。

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

【讨论】:

这很好用。其他答案没有。你也可以在接受函数中做同样的工作。 this.files 也存在那里。这会稍微缩短代码。 将此代码放在 dropzone.js 或 html 代码中放置表单的位置 这是对另一个问题(如何覆盖以前上传的文件)的一个很好的回答。 在尝试了其他答案之后,这是唯一一个完全按照我想要的方式工作的答案。应该被接受的答案,恕我直言。 对我来说,在当前的 Chrome 上,当只有一个文件时,files[1] 是 undefined,所以 if 条件总是返回 true。也许只是换成if (this.files[1])【参考方案2】:

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>

【讨论】:

不应该是&lt;form class="dropzone" id="myAwesomeDropzone"&gt;&lt;/form&gt;吗? @MKYung 我知道这已经过去了将近一年,但是 id 是由 Dropzone 提取的,并且 enyo 为您制作了骆驼案。所以调用它要容易得多。 (一开始可能会有点令人困惑......但它有效,所以我不抱怨。) 添加 1 个文件时效果很好,然后添加下一个文件。虽然,如果您在机器上选择多个文件并将它们全部拖到 dropzone 表单中,它们都会被添加。如何预防? 只有当且仅当我将&lt;script&gt;Dropzone...&lt;/script&gt; 放在&lt;form&gt; 上方时,它才对我有用【参考方案3】:

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

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

【讨论】:

这对我不起作用——但@oneirois 的另一个回答却是。 感谢您的提示,这就是我正在寻找的内容。如果适用,也不要忘记维护文件服务器端(即:以前的文件被删除)。 这在 autoProcessQueue 为 false 时不起作用。但是,它会在 maxFiles 为 0 且 autoProcessQueue 为 false 时触发。这一定是一个错误。 对我来说工作得非常好,并且同意这是最直观的单个文件上传过程:) +1 这个答案对于最终用户来说是一个更好的解决方案。使用init: function() this.on('maxfilesexceeded', function(file) this.removeAllFiles(); this.addFile(file); ); 选项在我的项目上运行良好,即使添加了autoProcessQueue: false 选项。【参考方案4】:

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

如何限制文件数量?

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

myDropzone.on("maxfilesexceeded", function(file)

    this.removeFile(file);
);

【讨论】:

这么多被低估的答案。【参考方案5】:

对我来说效果很好的替代解决方案:

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

【讨论】:

【参考方案6】:
    设置maxFiles计数:maxFiles: 1maxfilesexceeded事件中,清除所有文件并添加一个新文件:

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

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

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

【讨论】:

【参考方案7】:

你可以通过改变dropezone.js来限制上传文件的数量

Dropzone.prototype.defaultOptions = 最大文件数:10,

【讨论】:

更多这些选项可以在这里查看:dropzonejs.com/#configuration-options【参考方案8】:

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

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

【讨论】:

这是在我打开这个问题两天后添加的。 ;-)【参考方案9】:

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

使用css禁用dropzone点击:

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

信用:这个answer

【讨论】:

【参考方案10】:

所提供的解决方案的问题是您只能上传 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;
            ;
        
    ;

希望这会有所帮助;)

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

您还可以添加回调 - 这里我使用 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);
    

【讨论】:

【参考方案13】:
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);
        );
    
;

【讨论】:

以上是关于如何限制上传的 dropzone.js 文件的数量?的主要内容,如果未能解决你的问题,请参考以下文章

dropzone.js 图片上传接受的MimeTypes

如何使用 Dropzone.js 进行分块文件上传(仅限 PHP)?

如何从 dropzone.js 上传和删除文件

markdown 如何使用dropzone js上传文件

仅当单击提交按钮时,如何让 Dropzone.js 上传文件?

如何使用 dropzone.js 和 hapi.js 上传图片