JavaScript 文件拖拽上传插件 dropzone.js 介绍

dropzone.js 是一个开源的 JavaScript 库,提供 AJAX 异步上传功能。

安装

下载dropzone.js文件并添加到页面中即可。Dropzone 不依赖 jQuery 框架。

启用

可以新建一个div元素,然后通过如下 JavaScript 代码启用 dropzone(如果你使用 jQuery):

<div id="dropz"></div>
<script>
    $("#dropz").dropzone({
        url: "handle-upload.php",
        maxFiles: 10,
        maxFilesize: 512,
        acceptedFiles: ".js,.obj,.dae"
    });
</script>

如果你没有使用 jQuery 框架,也可以这样来初始化:

<div id="dropz"></div>
<script>
    var dropz = new Dropzone("#dropz", {
        url: "handle-upload.php",
        maxFiles: 10,
        maxFilesize: 512,
        acceptedFiles: ".js,.obj,.dae"
    });
</script>

其中url是必须的值,指明文件上传提交到哪个页面。其他的值都是可选的,如果使用默认值的话可以省略。

接收文件

Dropzone 并不含任何服务器端的支持和实现,利用 Dropzone 上传文件和利用下面基本的 HTML 表单对于服务器来说是一样的:

<form action="handle-upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
</form>

配置 Dropzone

此插件的特色就在于非常灵活,提供了许多可选项、事件等。下面分类介绍常用的配置项。

功能选项

翻译选项

添加事件监听

如果你希望在一个事件发生时采取一些额外的操作,而不干扰 Dropzone 的默认行为,那么你应该通过添加事件监听器的办法对事件做出响应,而非重写默认事件函数

重写默认事件函数的例子如下:

$("#dropz").dropzone({
    addedfile: function() {
        // actions...
    }
});

如果你重写默认事件函数,该事件发生时插件默认采取的动作将被覆盖。大多数情况下你仅仅想在事件发生时添加自己的行为,那么应该使用on方法。

jQuery 版本:

$("#dropz").dropzone({
    init: function() {
        this.on("addedfile", function(file) {
            // actions...
        });
    }
});

非 jQuery 版本:

dropz.on("addedfile", function(file) {
    // actions...
});

常用事件

以下事件接收 file 为第一个参数

以下事件接收一个 file list 作为第一个参数(仅当uploadMultiple被设为true时才会发生)

特殊事件

例子

这里我使用上面的选项、事件等写了一个例子,供参考:

<div class="dropz"></div>
<script>
    $(".dropz").dropzone({
        url: "handle-upload.php",
        addRemoveLinks: true,
        dictRemoveLinks: "x",
        dictCancelUpload: "x",
        maxFiles: 10,
        maxFilesize: 5,
        acceptedFiles: ".js",
        init: function() {
            this.on("success", function(file) {
                console.log("File " + file.name + "uploaded");
            });
            this.on("removedfile", function(file) {
                console.log("File " + file.name + "removed");
            });
        }
    });
</script>

外观

Dropzone 下载之后没有自带任何 CSS 样式(人家只有一个 js 文件嘛)。我觉得官网提供的 Demo 的外观设计就非常不错,可以供大家参考。

其他教程

Dropzone 的作者在插件的 GitHub Wiki 页面上提供了很多额外教程,非常好,也推荐大家看一看。

这里我只翻译一部分我觉得常用的教程的标题:

  1. 如何显示服务器返回的错误信息?
  2. 如何在所有文件上传完毕时得到通知?
  3. 如何显示出已经保存在服务器上的文件?
  4. 自己实现删除文件时的提示功能
  5. 为文件提供自定义缩略图
  6. 点击一个按钮再上传所有文件
  7. 点击一个按钮删除所有文件
  8. 把 Dropzone 放到一个已存在的表单中