HTML
CSS
JavaScript
HTML
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
<title>dropzone上传插件 - 光年(Light Year Admin)后台管理系统模板</title>
<link rel="icon" href="favicon.ico" type="image/ico">
<meta name="keywords" content="LightYear,光年,后台模板,后台管理系统,光年HTML模板">
<meta name="description" content="LightYear是一个基于Bootstrap v3.3.7的后台管理系统的HTML模板。">
<meta name="author" content="yinqi">
<link href="http://lyear.itshubao.com/iframe/css/bootstrap.min.css" rel="stylesheet">
<link href="http://example.itshubao.com/demo/css/materialdesignicons.min.css" rel="stylesheet">
<!--使用自定义主题的时候可不应用这两样式文件-->
<link rel="stylesheet" href="http://libs.itshubao.com/dropzone/min/basic.min.css" />
<link rel="stylesheet" href="http://libs.itshubao.com/dropzone/min/dropzone.min.css" />
<link href="http://lyear.itshubao.com/iframe/css/style.min.css" rel="stylesheet">
</head>
  
<body>
<div class="container-fluid">
  
  <div class="row">
    <div class="col-md-12">
      <div class="card">
        <div class="card-header"><h4>上传插件 dropzone</h4></div>
        <div class="card-body">
          
          <p>这里演示的是自定义主题的使用方法,示例最主要的就是使用这个方式。(这里演示的例子无法初始化图片,自行下载示例文件观看即可)</p>
          <form action="#!" method="post" id="example-from" onsubmit="return false;" class="row">
            <div class="form-group col-md-12">
              <label>多图上传</label>
              <div id="example-uploads" class="m-b-10">
                <span class="btn btn-success fileinput-button">
                  <i class="mdi mdi-plus"></i>
                  <span>添加文件...</span>
                </span>
                <button type="submit" class="btn btn-primary start">
                  <i class="mdi mdi-cloud-upload"></i>
                  <span>开始上传</span>
                </button>
                <button type="reset" class="btn btn-warning cancel">
                  <i class="mdi mdi-cancel"></i>
                  <span>取消上传</span>
                </button>
              </div>
              
              <!--总体进度条,这里不用,如果你需要,可以打开(包括上面的样式和下面的js处理)
              <div class="fileupload-process">
                <div id="total-progress" class="progress progress-striped active" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0">
                  <div class="progress-bar progress-bar-success" style="width:0%;" data-dz-uploadprogress></div>
                </div>
              </div>
              -->
              
              <!--重设上传主题-->
              <ul class="list-inline clearfix" id="previews">
                <li id="template" class="file-row col-xs-6 col-sm-3 col-md-2">
                  <!-- 它用作文件预览模板 -->
                  <div class="dropzone-preview">
                    <img data-dz-thumbnail />
                    <input type="hidden" class="pic_hidden_url" name="picurl[]" value="" />
                  </div>
                  <div class="dropzone-message">
                    <p class="dropzone-name" data-dz-name></p>
                    <strong class="error text-danger" data-dz-errormessage></strong>
                  </div>
                  <div class="dropzone-progress">
                    <p class="dropzone-size" data-dz-size></p>
                    <div class="progress progress-striped active" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0">
                      <div class="progress-bar progress-bar-success" style="width:0%;" data-dz-uploadprogress></div>
                    </div>
                  </div>
                  <div class="dropzone-btns">
                    <button class="btn btn-primary btn-sm start">
                      <i class="mdi mdi-upload"></i>
                      <span>上传</span>
                    </button>
                    <button data-dz-remove class="btn btn-warning btn-sm cancel">
                      <i class="mdi mdi-cancel"></i>
                      <span>取消</span>
                    </button>
                    <button data-dz-remove class="btn btn-danger btn-sm delete">
                      <i class="mdi mdi-delete"></i>
                      <span>删除</span>
                    </button>
                  </div>
                </li>
              </ul>
              <!--End 重设上传主题-->
            </div>
            <div class="form-group col-md-12">
              <button type="submit" class="btn btn-primary ajax-post">确 定</button>
            </div>
          </form>
          
          <p>默认的使用情况。</p>
          <div id="example-dropzone" class="dropzone"></div>
          
        </div>
      </div>
    </div>
    
  </div>
  
</div>
  
<script type="text/javascript" src="http://lyear.itshubao.com/iframe/js/jquery.min.js"></script>
<script type="text/javascript" src="http://libs.itshubao.com/dropzone/min/dropzone.min.js"></script>
</body>
</html>
CSS
#previews .file-row.dz-success .progress {
  opacity: 0;
  transition: opacity 0.3s linear;
}
#previews .file-row .delete {
  display: none;
}
#previews .file-row.dz-success .start,
#previews .file-row.dz-success .cancel {
  display: none;
}
#previews .file-row.dz-success .delete {
  display: block;
}
.dropzone-preview {
  display: flex;
  justify-content: center;
  align-items: center;
  background-color: #fafafa;
  min-height:110px;
}
.dropzone-preview img {
  max-width: 100%;
  max-height: 110px;
}
.dropzone-message .dropzone-name {
  margin-top: 10px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
#previews li {
  margin-bottom: 10px;
}
@media screen and (max-width: 420px) {
  #example-uploads .btn span {
    display: none;
  }
}
@media screen and (max-width: 380px) {
  .dropzone-btns .btn span {
    display: none;
  }
}
JavaScript
$(function() {
    // 表单提交
    $('.ajax-post').click(function(){
        console.log($('#example-from').serialize());
    });
  
    // 默认使用情况
    $("#example-dropzone").dropzone({
        url: "http://example.itshubao.com/index/test/upload/type/dropzone",
        dictDefaultMessage: '拖动文件至此或者点击上传',
        method: "post",  // 也可用put
        paramName: "file", // 默认为file
        maxFiles: 1,// 一次性上传的文件数量上限
        maxFilesize: 2, // 文件大小,单位:MB
        acceptedFiles: ".jpg,.gif,.png,.jpeg", // 上传的类型
        addRemoveLinks: true,
        parallelUploads: 1,// 一次上传的文件数量
        dictDefaultMessage: '拖动文件至此或者点击上传',
        dictMaxFilesExceeded: "您最多只能上传1个文件!",
        dictResponseError: '文件上传失败!',
        dictInvalidFileType: "文件类型只能是*.jpg,*.gif,*.png,*.jpeg。",
        dictFallbackMessage: "浏览器不受支持",
        dictFileTooBig: "文件过大上传文件最大支持.",
        dictRemoveLinks: "删除",
        dictCancelUpload: "取消",
        init: function () {
            this.on("addedfile", function (file) {
                // 上传文件时触发的事件
            });
            this.on("success", function (file, data) {
                // 上传成功触发的事件
            });
            this.on("error", function (file, data) {
                // 上传失败触发的事件
            });
            this.on("removedfile", function (file) {
                // 删除文件时触发的方法
            });
        }
    });
    
    
    /**
     * 以下是自定义主题的使用
     */
    
    // 获取模板HTML并将其从文档中删除
    var previewNode = document.querySelector("#template");
    previewNode.id = "";
    var previewTemplate = previewNode.parentNode.innerHTML;
    previewNode.parentNode.removeChild(previewNode);
    
    Dropzone.autoDiscover = false;
    var myDropzone = new Dropzone(document.body, {
        url: "http://example.itshubao.com/index/test/upload/type/dropzone",   // 文件提交地址
        method: "post",      // 也可用put
        acceptedFiles: ".png,.gif,.jpg,.jpeg", // 允许上传的文件格式
        thumbnailWidth: 165,  // 设置缩略图的缩略比
        thumbnailHeight: 110, // 就像 thumbnailWidth一样。如果为空, 将不能重置尺寸。
        parallelUploads: 20,  // 要并行处理的文件上载数量
        maxFilesize: 2,       // 最大上传文件大小(MB)
        
        autoQueue: false,                 // 确保在手动添加之前文件不会排队
        previewTemplate: previewTemplate, // 主题模板
        previewsContainer: "#previews",   // 上传图片的预览窗口
        clickable: ".fileinput-button",   // 定义应该用作单击触发器以选择文件的元素
        
        dictResponseError: '文件上传失败!',
        dictInvalidFileType: "文件类型只能是*.jpg,*.gif,*.png,*.jpeg",
        dictFallbackMessage: "浏览器不受支持",
        dictFileTooBig: "文件超过最大限制(2M)",
    });
    
    myDropzone.on("addedfile", function(file) {
        // 连接开始按钮
        file.previewElement.querySelector(".start").onclick = function() { myDropzone.enqueueFile(file); };
    });
    
    myDropzone.on("totaluploadprogress", function(progress) {
        // 更新总进度条
        //$("#total-progress .progress-bar").css('width', progress + "%");
    });

    myDropzone.on("sending", function(file) {
        // 上传开始时显示总进度条
        //$("#total-progress").css('opacity', 1);
        // 并禁用“开始”按钮
        file.previewElement.querySelector(".start").setAttribute("disabled", "disabled");
    });

    myDropzone.on("queuecomplete", function(progress) {
        // 当没有东西上传时隐藏总进度条
        //$("#total-progress").css('opacity', 0);
    });
    
    myDropzone.on("success", function(file, response) {
        // 这里假设返回格式为{"status":200,"info":"成功","picurl":".\/upload\/lyear_5ddfc00174bbb.jpg"}
        var resData = JSON.parse(response);
        if (resData.status == '200') {
            file.previewElement.querySelector('.pic_hidden_url').setAttribute('value', resData.picurl);
        } else {
            alert(resData.tips);
        }
    });
  
    myDropzone.on("error", function(file, errorMessage){
        //不接受该文件(非定义的可接受类型)或上传失败
    	alert(errorMessage);
    	myDropzone.removeFile(file);
    });

    // 设置所有传输的按钮,"add files" 按钮不需要设置,因为 `clickable` 已指定。
    $("#example-uploads .start").on('click', function() {
        myDropzone.enqueueFiles(myDropzone.getFilesWithStatus(Dropzone.ADDED));
    })
    $("#example-uploads .cancel").on('click', function() {
        myDropzone.removeAllFiles(true);
    });
    
    // 下面用以回显已上传的图片,编辑时可用
    // 后端存储多图片的方式,1、json保存图片信息,如下;2、有独立的附件表单独存储,相关的地方只保存id值
    // 这里以保存json为例,上传时可增加更多的隐藏域来保存上传成功后的图片信息,修改时直接返回,存id同理组装一下数据即可。
    
    var testJson = [{"size":"11626","name":"dribbble.png","picurl":"http:\/\/example.itshubao.com\/uploads\/images\/dribbble.png"},{"size":"122127","name":"Behance.png","picurl":"http:\/\/example.itshubao.com\/uploads\/images\/Behance.png"}];
    
    for(var val in testJson) {
        var mockFile = {
            size: testJson[val].size,  // 元素大小
            name: testJson[val].name, // 元素名称
            type: '.png,.gif,.jpg,.jpeg', // 元素类型
        };
        myDropzone.addFile(mockFile);                                 // 添加mock元素到显示区域
        myDropzone.options.thumbnail(mockFile, testJson[val].picurl); // 给mock元素添加数据源
        myDropzone.options.success(mockFile);                         // 给mock元素绘制上传成功标识
        mockFile.status = 'success';                                  // 设定为已成功的状态
        mockFile.previewElement.querySelector('.pic_hidden_url').setAttribute('value', testJson[val].picurl);
    }
});