• LayUi:实现多图片上传预览


    需求:实现上传图片时,现在页面上预览缓存,可删除,可点击放大查看,可上传多张图片,点击上传时才上传图片。

    效果图:

     

    代码:

      1 <!DOCTYPE html>
      2 <html>
      3 <head>
      4     <meta charset="utf-8">
      5     <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
      6     <title>上传多图片页面</title>
      7     <link rel="stylesheet" href="../layui/css/layui.css">
      8     <style>
      9         *{ margin: 0; padding: 0;}
     10         #formdata{max-width: 852px; margin:0 auto}
     11 
     12         .btn { border-radius: 0px; font-weight: 100; cursor: pointer; display: inline-block; padding: 5px; font-size: 14px;
     13             font-family: '微软雅黑' }
     14 
     15         .btn-primary { color: #fff; text-shadow: 0 1px rgba(0, 0, 0, .1);
     16             background-image: -webkit-linear-gradient(top, #4d90fe 0, #4787ed 100%);
     17             background-image: -o-linear-gradient(top, #4d90fe 0, #4787ed 100%);
     18             background-image: -webkit-gradient(linear, left top, left bottom, from(#4d90fe), to(#4787ed));
     19             background-image: linear-gradient(to bottom, #4d90fe 0, #4787ed 100%);
     20             filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4d90fe', endColorstr='#ff4787ed', GradientType=0);
     21             filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
     22             background-repeat: repeat-x;
     23             border: 1px solid #3079ed;
     24         }
     25 
     26         .btn-success { color: #fff; text-shadow: 0 1px rgba(0, 0, 0, .1);
     27             background-image: -webkit-linear-gradient(top, #35aa47 0, #35aa47 100%);
     28             background-image: -o-linear-gradient(top, #35aa47 0, #35aa47 100%);
     29             background-image: -webkit-gradient(linear, left top, left bottom, from(#35aa47),
     30             to(#35aa47));
     31             background-image: linear-gradient(to bottom, #35aa47 0, #35aa47 100%);
     32             filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff35aa47',
     33             endColorstr='#ff35aa47', GradientType=0);
     34             filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
     35             background-repeat: repeat-x;
     36             border: 1px solid #359947;
     37         }
     38 
     39         .gallery .img-item { position: relative; cursor: pointer; }
     40 
     41         .gallery .img-item .delete { position: absolute; display: block; width: 20px; height: 20px;
     42             color: #fff; background: rgba(232, 0, 0, 0.7);  line-height: 20px; text-align: center;
     43             border-radius: 50%; top: 25px; right: 25px; cursor: pointer; }
     44 
     45         .img { width: 100px; height: 100px; margin: 20px; cursor: pointer;}
     46 
     47         .btn-upload{ margin: 20px; float: left; display: block; width: 100px; height: 100px;
     48             border: 1px solid #ddd; background: #ebebeb; line-height: 100px; font-size: 14px;
     49             text-align: center; color: #808080; cursor: pointer; }
     50         .box {
     51             width: 100%;
     52             height: 100%;
     53             background: #333;
     54             position: absolute;
     55             top:0px;
     56             left:0px;
     57             margin: 0 auto;
     58             align-items: center; /*定义body的元素垂直居中*/
     59             justify-content: center; /*定义body的里的元素水平居中*/
     60             display: none;
     61             overflow: hidden
     62         }
     63         .box img{
     64             width:100%;
     65             position: absolute;
     66         }
     67 
     68     </style>
     69 
     70 </head>
     71 <body>
     72 <form class="layui-form layui-form-pane" id="formdata" method="post" enctype="multipart/form-data">
     73     <!-- 上传图片模块 -->
     74     <div style="padding: 20px; font-size: 30px; ">上传图片</div>
     75     <!-- <form id="formdata" method="post" enctype="multipart/form-data"> -->
     76     <div class="gallery" id="gallery">
     77         <div class="img-item" style="display: inline-block;" id="first-btn-upload">
     78             <label for="btn-upload" class="btn-upload" id="btn-upload">点击上传</label>
     79             <div style="clear: both;"></div>
     80         </div>
     81     </div>
     82     <input id="file" type="file" multiple style="display: none">
     83     <!-- </form> -->
     84     <div class="box">
     85         <img src="" />
     86     </div>
     87     <button class="layui-btn" lay-submit lay-filter="uploadpic" style="display: none" id="uploadpic">上传</button>
     88 
     89     </div>
     90 </form>
     91 <button class="layui-btn" onclick="upload()">上传</button>
     92 <input type="file" id='p_image' accept="image/*" capture='camera' style="opacity: 0"/>
     93 <img id="tempImage" src="" style="display:none;"/>
     94 
     95 <script src="../js/jquery-1.11.3.js"></script> <!-- 你必须先引入jQuery1.8或以上版本 -->
     96 <!-- 必须先引入2.0.8版本的hammer.min.js -->
     97 <script src="../hammer/2.0.8/hammer.min.js" type="text/javascript" charset="utf-8"></script>
     98 <script src="../layui/layui.js"></script>
     99 <script type="text/javascript" src="../js/exif.js"></script>
    100 <script>
    101     // 保存证照执法
    102     function upload(){
    103         $("#uploadpic").click();
    104     }
    105 
    106     $(function  () {
    107         layui.use('form', function(){
    108             var form = layui.form;
    109             var layer = layui.layer;
    110             //监听提交
    111             form.on('submit(uploadpic)', function(data){
    112                 layui.use('jquery',function(){
    113                     var $=layui.$;
    114                     // 创建FormData根据form
    115                     var uploaddata = new FormData($("#formdata")[0]);
    116                     // 遍历图片数组把图片添加到FormData中
    117                     // var files = document.getElementById("file").files;
    118                     var maxsize = 0;
    119                     for (var i = 0; i < files.length; i++) {
    120                         uploaddata.append("file", files[i]);
    121                         maxsize = maxsize + files[i].size;
    122                     }
    123                     if(maxsize>52428800){
    124                         layer.msg('上传的文件总大小不能超过50MB,请重新上传!');
    125                         return;
    126                     }
    127                     $.ajax({
    128                         type: 'post',
    129                         url: '/uploadPics.action', // ajax请求路径
    130                         data: uploaddata,
    131                         async: false,
    132                         // dataType:"json",
    133                         contentType: false,
    134                         processData: false,
    135                         success: function(data){
    136 
    137                         },
    138                         error: function (XMLHttpRequest, textStatus, errorThrown) {
    139                             layer.msg("发生错误!");
    140                         }
    141                     });
    142                 });
    143                 return false;//禁止跳转,否则会提交两次,且页面会刷新
    144 
    145             });
    146         });
    147     })
    148 
    149     // 预览
    150     function preView(obj){
    151         var pimg = obj;
    152         // var pimg = document.querySelector("img");
    153         var oImg = document.querySelector(".box img");
    154         var oBox = document.querySelector(".box");
    155         // pimg.onclick=function(){
    156         oBox.style.display="flex"
    157         oImg.src=pimg.src
    158         // }
    159         oBox.onclick=function(){
    160             oBox.style.display="none"
    161             oImg.src=''
    162         }
    163         var hammer = new Hammer(oImg);//hammer实例化
    164         hammer.get('pan').set({direction: Hammer.DIRECTION_ALL});//激活pan(移动)功能
    165         hammer.get('pinch').set({enable: true});//激活pinch(双指缩放)功能
    166         hammer.on("panstart", function(event) {
    167             var left = oImg.offsetLeft;
    168             var tp = oImg.offsetTop;
    169             hammer.on("panmove", function(event) {
    170                 oImg.style.left = left + event.deltaX + 'px';
    171                 oImg.style.top = tp + event.deltaY + 'px';
    172             });
    173         })
    174 
    175         hammer.on("pinchstart", function(e) {
    176             hammer.on("pinchout", function(e) {
    177                 oImg.style.transition = "-webkit-transform 300ms ease-out";
    178                 oImg.style.webkitTransform = "scale(2.5)";
    179             });
    180             hammer.on("pinchin", function(e) {
    181                 oImg.style.transition = "-webkit-transform 300ms ease-out";
    182                 oImg.style.webkitTransform = "scale(1)";
    183             });
    184         })
    185     }
    186 
    187     // 创建数组保存图片
    188     var files = new Array();
    189     var id = 0;
    190     // 选择图片按钮隐藏input[file]
    191     $("#btn-upload").click(function() {
    192         $("#file").trigger("click");
    193     });
    194     // 选择图片
    195     $("#file").change(function() {
    196         // 获取所有图片
    197         var img = document.getElementById("file").files;
    198         // 遍历
    199         for (var i = 0; i < img.length; i++) {
    200             // 得到图片
    201             var file = img[i];
    202             // 判断是否是图片
    203 
    204             var flag = judgeImgSuffix(file.name);
    205             if(flag){
    206 
    207             }else{
    208                 alert("要求图片格式为png,jpg,jpeg,bmp");
    209                 return;
    210             }
    211 
    212             // 把图片存到数组中
    213             files[id] = file;
    214             id++;
    215             // 获取图片路径
    216             var url = URL.createObjectURL(file);
    217 
    218             // 创建img
    219             var box = document.createElement("img");
    220             box.setAttribute("src", url);
    221             box.className = 'img';
    222             box.onclick = function(){
    223                 preView(this);
    224             };
    225 
    226             // 创建div
    227             var imgBox = document.createElement("div");
    228             imgBox.style.float = 'left';
    229             imgBox.className = 'img-item';
    230 
    231             // 创建span
    232             var deleteIcon = document.createElement("span");
    233             deleteIcon.className = 'delete';
    234             deleteIcon.innerText = 'x';
    235             // 把图片名绑定到data里面
    236             deleteIcon.id = img[i].name;
    237             // 把img和span加入到div中
    238             imgBox.appendChild(deleteIcon);
    239             imgBox.appendChild(box);
    240             // 获取id=gallery的div
    241             var body = document.getElementsByClassName("gallery")[0];
    242             // body.appendChild(imgBox);
    243             var showPlace =document.getElementsByClassName("img-item")[0];
    244             body.insertBefore(imgBox,showPlace);
    245             // 点击span事件
    246             $(deleteIcon).click(function() {
    247                 // 获取data中的图片名
    248                 var filename = $(this).attr('id');
    249                 // 删除父节点
    250                 $(this).parent().remove();
    251                 var fileList = Array.from(files);
    252                 // 遍历数组
    253                 for (var j = 0; j < fileList.length; j++) {
    254                     // 通过图片名判断图片在数组中的位置然后删除
    255                     if (fileList[j].name == filename) {
    256                         fileList.splice(j, 1);
    257                         id--;
    258                         break;
    259                     }
    260                 }
    261                 files = fileList;
    262             });
    263         }
    264     });
    265 
    266     // 判断是否是图片类型
    267     function judgeImgSuffix(path){
    268         var index = path.lastIndexOf('.');
    269         var suffix = "";
    270         if(index > 0){
    271             suffix = path.substring(index+1);
    272         }
    273         if("png"==suffix || "jpg"==suffix || "jpeg"==suffix || "bmp"==suffix || "PNG"==suffix || "JPG"==suffix || "JPEG"==suffix || "BMP"==suffix){
    274             return true;
    275         }else{
    276             return false;
    277         }
    278     }
    279 </script>
    280 </body>
    281 </html>

    后端使用@RequestParam(value="file", required=false) MultipartFile[] file接受图片数据。

  • 相关阅读:
    第七周总结
    第六周总结
    第五周总结
    第四周总结
    第三周总结
    第二周总结
    第一周总结
    《需求分析和系统设计》阅读笔记三
    《需求分析和系统设计》阅读笔记二
    Linux——error while loading shared libraries 的解决方法
  • 原文地址:https://www.cnblogs.com/bestlmc/p/11907625.html
Copyright © 2020-2023  润新知