当前位置 主页 > 网站技术 > 代码类 >

    js实现多图和单图上传显示

    栏目:代码类 时间:2019-12-18 12:07

    项目中经常会大量的使用到图片上传,之前涉及到的时候经常会在网上下载一些素材直接拿过来使用,但是随着项目的增多发现用的是各式各样的,导致非常混乱。所以抽空写了一个DEMO来梳理下图片上传的流畅以及单图和多图上传需要注意的点。

    多图上传

    多图上传,这里仅仅是做了前端的展示效果,实际项目中,多图上传应该是每次上传一张图片后向后台发送一次请求,后台返回img路径然后进行展现。

    为什么一定要传入后台在进行展现呢?

    1.如果直接在前台先展现base64图片路径,在向后台发送请求。如果接口出现错误后,会给用户产生错觉,以为图片上传成功,而这时后台是没有接收到图片的;

    2.file文件每次发生变化,会将之前的files文件给覆盖掉。如果直接展现不用ajax提交后,最终用form提交只会提交最后一张。

    <!DOCTYPE html>
    <html lang="en">
    <head>
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <meta http-equiv="X-UA-Compatible" content="ie=edge">
     <title>多图上传/单图上传</title>
     <style>
      *{
       margin: 0;
       padding: 0;
      }
      .box{
       width: 1000px;
       height: 120px;
       margin: 0 auto;
       border: 1px solid #ddd;
       margin-top: 20px;
       box-sizing: border-box;
       padding: 10px;
      }
      .upload{
       width: 100px;
       height: 100px;
       float: left;
       position: relative;
       overflow: hidden;
      }
      .upload input{
       position: absolute;
       z-index: 1000;
       top:0;
       left:0;
       width: 100%;
       height: 100%;
       opacity: 0;
      }
      .upload a{
       display: block;
       width: 100%;
      }
      .upload img{
       display: block;
       width: 100%;
       height: 100%;
      }
      .imgList{
       float: left;
       overflow: hidden;
      }
      .imgList .item{
       width: 100px;
       height: 100px;
       margin-right: 20px;
       float: left;
       position: relative;
      }
      .imgList .item img{
       display: block;
       width: 100%;
       height: 100%;
      }
      .imgList .item span{
       position: absolute;
       top: 0;right: 0;
       width: 100%;
       background: red;
       color:#fff;
       height: 20px;
       width: 20px;
       text-align: center;
       border-radius: 50%;
       cursor: pointer;
      }
     </style>
    </head>
    <body>
     <div class="box">
      <!-- 放图片的位置 -->
      <div class="imgList" ></div>
      <!-- 上传按钮 -->
      <div class="upload">
       <input type="file" name="file" value="" multiple accept="image/*" onchange="uploadImg(this);">
       <a href="javascript:void(0)" rel="external nofollow" ><img src="z_add.png" alt=""></a>
      </div>
     </div>
     <script>
       function uploadImg(obj){   
        var files = obj.files;//获取上传文件后的fileList
        var imgList = [];//声明空数组用来接收上传完成后的图片
        for(var i = 0; i<files.length;i++){
         var imgUrl = window.URL.createObjectURL(files[i]);//将文件转换成base64 URL格式
         imgList.push(imgUrl);//将url压入到数组中 **如果需要图片统一选择完毕后,点击上传按钮统一提交,那么直接拿这imgList给后台传递即可。**
         // 循环创建img容器用来放置url在页面上显示
         var img = document.createElement('img')
         img.setAttribute("src", imgList[i]);
         //删除按钮
         var close = document.createElement('span')
         close.innerHTML="x"
         close.className='close'
         close.setAttribute('onclick',"imgRemove(this)")
         //创建放置img的盒子
         var item = document.createElement('div');
         item.className='item';
         item.append(img)
         item.append(close)
         var box = document.getElementById("imgList");
         box.append(item);
         //ajax向后台发送请求
         
        }
       }
       //删除代码
       function imgRemove(obj){
        obj.parentNode.remove()
       }
       
     </script>
    </body>
    </html>