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>webuploader上传插件 - 光年(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" type="text/css" href="http://libs.itshubao.com/webuploader/webuploader.css">
<link rel="stylesheet" type="text/css" href="http://libs.itshubao.com/magnific-popup/magnific-popup.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>上传插件 webuploader</h4></div>
        <div class="card-body">
          
          <form action="#" method="post" onsubmit="return false;" id="example-form" class="row">
            <div class="form-group col-md-12">
              <label>单图片上传</label>

              <div class="js-upload-image">
                <input type="hidden" name="one_pic" data-multiple="false" data-size="2048000" data-ext='gif,jpg,jpeg,bmp,png' id="one_pic" value="">
                <div id="picker_one_pic">上传单张图片</div>
                <!--ul用来存放图片预览-->
                <ul id="file_list_one_pic" class="list-inline clearfix lyear-uploads-pic"></ul>
              </div>
              
            </div>
            <div class="form-group col-md-12">
              <label>多图片上传</label>

              <div class="js-upload-image">
                <input type="hidden" name="more_pic" data-multiple="true" data-size="2048000" data-ext='gif,jpg,jpeg,bmp,png' id="more_pic" value="">
                <div id="picker_more_pic">上传多张图片</div>
                <!--ul用来存放图片预览-->
                <ul id="file_list_more_pic" class="list-inline clearfix lyear-uploads-pic">
                
                  <!--这里是示例,初始化一个已上传成功的图片,用于编辑时显示。这里假设图片ID为999-->
                  <li class="col-xs-6 col-sm-3 col-md-2 pic-item" id="999">
                    <figure>
                      <img src="http://libs.itshubao.com/pic/small_002.jpg" />
                      <figcaption>
                        <a class="btn btn-round btn-square btn-primary btn-link-pic" data-id="999" href="http://libs.itshubao.com/pic/small_002.jpg"><i class="mdi mdi-eye"></i></a>
                        <a class="btn btn-round btn-square btn-danger btn-remove-pic" href="#!"><i class="mdi mdi-delete"></i></a>
                      </figcaption>
                    </figure>
                  </li>
                  
                </ul>
              </div>
              
            </div>
          </form>
          
        </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/webuploader/webuploader.min.js"></script>
<script type="text/javascript" src="http://libs.itshubao.com/magnific-popup/jquery.magnific-popup.min.js"></script>
</body>
</html>
CSS
.lyear-uploads-pic {
  display: inherit;
}
.lyear-uploads-pic > li.pic-item {
  margin-top: 10px;
}
.lyear-uploads-pic li.pic-item .progress {
  position: absolute;
  bottom: 0px;
  margin-bottom: 0px;
  left: 5px;
  right: 5px;
}
.lyear-uploads-pic .success,
.lyear-uploads-pic .error {
  position: absolute;
  top: 0px;
  background-color: rgba(0, 0, 0, .125);
  right: 5px;
  left: 5px;
  color: #fff;
  text-align: center;
}
.lyear-uploads-pic figure img {
  width: auto;
  max-width: 100%;
  max-height: 110px;
}
.lyear-uploads-pic figure {
  display: flex;
  justify-content: center;
  align-items: center;
  background-color: #f5f5f5;
}
.webuploader-container label {
  margin-bottom: 0px;
}
JavaScript
$(function() {
    /*
     * 示例上传成功采用返回ID的形式,即上传成功以附件表形式存储,返回给前端ID值。
     * 成功返回示例:{"status":200,"info":"成功","class":"success","id":1,"picurl":".\/upload\/images\/lyear_5ddfc00174bbb.jpg"}
     * 这里设定单图上传为js-upload-image,多图上传为js-upload-images
     * 存放预览图的div元素,命名:file_list_*;后面的上传按钮的命名:filePicker_*(这里的*跟隐藏的input的name对应)。方便单页面中存在有多个上传时区分以及使用。
     * input上保存上传后的图片ID以及设置上传时的一些参数,
     */
    
    // 通用绑定,
    $('.js-upload-image,.js-upload-images').each(function() {
        var $input_file      = $(this).find('input'),
            $input_file_name = $input_file.attr('name'),
            $multiple        = $input_file.data('multiple'),  // 是否选择多个文件
            $ext             = $input_file.data('ext'),       // 支持的文件后缀,示例以图片为例
            $size            = $input_file.data('size');      // 支持最大的文件大小
        var $file_list = $('#file_list_' + $input_file_name);
        var ratio = window.devicePixelRatio || 1;
        var thumbnailWidth = 165 * ratio;
        var thumbnailHeight = 110 * ratio;
        
        var uploader = WebUploader.create({
            auto: true,
            duplicate: true,
            resize: false,
            swf: './js/webuploader/Uploader.swf',
            server: 'http://example.itshubao.com/index/test/upload/type/webuploader',
            pick: {
                id: '#picker_' + $input_file_name,
                multiple: $multiple
            },
            fileSingleSizeLimit: $size,
            accept: {
                title: 'Images',
                extensions: $ext,
                mimeTypes: 'image/*'
            }
        });
        
        uploader.on('fileQueued', function(file) {
            
            var $li = $('<li class="col-xs-6 col-sm-3 col-md-2 pic-item" id="' + file.id + '">' +
                        '  <figure>' +
                        '    <img>' +
                        '    <figcaption>' +
                        '      <a class="btn btn-round btn-square btn-primary btn-link-pic" href="#!"><i class="mdi mdi-eye"></i></a>' +
                        '      <a class="btn btn-round btn-square btn-danger btn-remove-pic" href="#!"><i class="mdi mdi-delete"></i></a>' +
                        '    </figcaption>' +
                        '  </figure>' +
                        '</li>'),
                $img = $li.find('img');
            
            if ($multiple) {
                $file_list.append($li);
            } else {
                $file_list.html($li);
                $input_file.val('');
            }
            uploader.makeThumb(file, function(error, src) {
                if (error) {
                    $img.replaceWith('<span>不能预览</span>');
                    return;
                }
                $img.attr('src', src);
            }, thumbnailWidth, thumbnailHeight);
            $('<div class="progress progress-sm"><div class="progress-bar progress-bar-primary progress-bar-striped" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%"></div></div>').appendTo($li);
        });
        uploader.on('uploadProgress', function(file, percentage) {
            var $percent = $('#' + file.id).find('.progress-bar');
            $percent.css('width', percentage * 100 + '%');
        });
        uploader.on('uploadSuccess', function(file, response) {
            var $li = $('#' + file.id);
            if (response.status == 200) { // 返回200成功
                if ($multiple) {
                    if ($input_file.val()) {
                        $input_file.val($input_file.val() + ',' + response.id);
                    } else {
                        $input_file.val(response.id);
                    }
                    $li.find('.btn-remove-pic').attr('data-id', response.id);
                } else {
                    $input_file.val(response.id);
                }
            }
            $('<div class="' + response.class + '"></div>').text(response.info).appendTo($li);
            $li.find('a.btn-link-pic').attr('href', response.picurl);
        });
        uploader.on('uploadError', function(file) {
            var $li = $('#' + file.id);
            $('<div class="error">上传失败</div>').appendTo($li);
        });
        uploader.on('error', function(type) {
            switch (type) {
            case 'Q_TYPE_DENIED':
                alert('图片类型不正确,只允许上传后缀名为:' + $ext + ',请重新上传!');
                //lightyear.notify('图片类型不正确,只允许上传后缀名为:' + $ext + ',请重新上传!', 'danger');
                break;
            case 'F_EXCEED_SIZE':
                alert('图片不得超过' + ($size / 1024) + 'kb,请重新上传!');
                //lightyear.notify('图片不得超过' + ($size / 1024) + 'kb,请重新上传!', 'danger');
                break;
            }
        });
        uploader.on('uploadComplete', function(file) {
            setTimeout(function() {
                $('#' + file.id).find('.progress').remove();
            }, 500);
        });
        // 删除操作
        $file_list.delegate('.btn-remove-pic', 'click', function() {
            if (confirm("你确认要删除该图片吗?")) { // 可改为对话框插件
                if ($multiple) {
                    var id = $(this).data('id'),
                    ids = $input_file.val().split(',');
                    if (id) {
                        for (var i = 0; i < ids.length; i++) {
                            if (ids[i] == id) {
                                ids.splice(i, 1);
                                break;
                            }
                        }
                        $input_file.val(ids.join(','));
                    }
                } else {
                    $input_file.val('');
                }
                $(this).closest('.pic-item').remove();
            }
        });
        // 接入图片查看插件
        $(this).magnificPopup({
            delegate: 'a.btn-link-pic',
            type: 'image',
            gallery: {
                enabled: true
            }
        });
    });
});