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


Posted in Javascript onDecember 18, 2019

项目中经常会大量的使用到图片上传,之前涉及到的时候经常会在网上下载一些素材直接拿过来使用,但是随着项目的增多发现用的是各式各样的,导致非常混乱。所以抽空写了一个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" id="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>

单图上传

去掉input中的multiple 属性就变成了单图上传;

<input type="file" name="file" value="" accept="image/*" onchange="uploadImg(this);">

按照上边的代码直接就可以实现单图上传和多图上传。下边在说下单图上传和多图上传提交需要注意的;

1.单图上传可以跟随form表单一起提交,给input一个name值后台就可以提交过去;

2.多图上传不可以跟form一起提交,因为每次上传后file只会保留最新的;可以先通过ajax将图片提交成功后,在form内去循环创建隐藏的input将后台返回的路径设置成改input的val值最后跟随form提交;需要注意隐藏的input的name值写成[]形式,比如:name=“img[]”。这样在form提交的时候后台就可以接受到所有的图片;

以上的代码,适用于前端点击file上传图片后的显示。具体与后台的一些交互可以根据实际项目中的需求进行增加!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 联动的无限级封装类,数据采用非Ajax方式,随意添加联动
Jun 29 Javascript
jquery easyui combox一些实用的小方法
Dec 25 Javascript
SinaEditor使用方法详解
Dec 28 Javascript
用svg制作富有动态的tooltip
Jul 17 Javascript
超实用的JavaScript代码段 附使用方法
May 22 Javascript
让你5分钟掌握9个JavaScript小技巧
Jun 09 Javascript
微信小程序实现倒计时补零功能
Jul 09 Javascript
vue2使用keep-alive缓存多层列表页的方法
Sep 21 Javascript
axios实现简单文件上传功能
Sep 25 Javascript
javascript设计模式之装饰者模式
Jan 30 Javascript
js实现菜单跳转效果
Dec 11 Javascript
JS实现简易日历效果
Jan 25 Javascript
JS获取当前时间的年月日时分秒及时间的格式化的方法
Dec 18 #Javascript
微信小程序实用代码段(收藏版)
Dec 17 #Javascript
微信小程序修改数组长度的问题的解决
Dec 17 #Javascript
微信小程序利用云函数获取手机号码
Dec 17 #Javascript
ant design实现圈选功能
Dec 17 #Javascript
15分钟学会vue项目改造成SSR(小白教程)
Dec 17 #Javascript
微信小程序获取复选框全选反选选中的值(实例代码)
Dec 17 #Javascript
You might like
木翼下载系统中说明的PHP安全配置方法
2007/06/16 PHP
ZF等常用php框架中存在的问题
2008/01/10 PHP
PHP编码规范的深入探讨
2013/06/06 PHP
单点登录 Ucenter示例分析
2013/10/29 PHP
PHP单例模式详解及实例代码
2016/12/21 PHP
jquery实现带复选框的表格行选中删除时高亮显示
2013/08/01 Javascript
JS的框架Polymer中的dom-if和is属性使用说明
2015/07/29 Javascript
跟我学习javascript解决异步编程异常方案
2015/11/23 Javascript
AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值
2016/01/25 Javascript
对js eval()函数的一些见解
2016/08/15 Javascript
解决vue多个路由共用一个页面的问题
2018/03/12 Javascript
JavaScript设计模式之模板方法模式原理与用法示例
2018/08/07 Javascript
解决Vue在封装了Axios后手动刷新页面拦截器无效的问题
2018/11/08 Javascript
LayUI switch 开关监听 获取属性值、更改状态的方法
2019/09/21 Javascript
layui将table转化表单显示的方法(即table.render转为表单展示)
2019/09/24 Javascript
p5.js实现故宫橘猫赏秋图动画
2019/10/23 Javascript
浅谈vue 组件中的setInterval方法和window的不同
2020/07/30 Javascript
[02:26]DOTA2英雄米拉娜基础教程
2013/11/25 DOTA
haskell实现多线程服务器实例代码
2013/11/26 Python
Zookeeper接口kazoo实例解析
2018/01/22 Python
基于Python中numpy数组的合并实例讲解
2018/04/04 Python
python 读取鼠标点击坐标的实例
2018/12/29 Python
Python Pandas数据中对时间的操作
2019/07/30 Python
python 批量修改 labelImg 生成的xml文件的方法
2019/09/09 Python
Python爬虫实现使用beautifulSoup4爬取名言网功能案例
2019/09/15 Python
new修饰符是起什么作用
2015/06/28 面试题
学生的自我鉴定范文
2013/10/24 职场文书
会计电算化个人求职信范文
2014/01/24 职场文书
幼儿园安全检查制度
2014/01/30 职场文书
项目合作协议书
2014/09/23 职场文书
八年级上册语文教学计划
2015/01/22 职场文书
施工单位工程部经理岗位职责
2015/04/09 职场文书
公安干警正风肃纪心得体会
2016/01/15 职场文书
2019年健身俱乐部的创业计划书
2019/08/26 职场文书
PHP使用非对称加密算法RSA
2021/04/21 PHP
详解JS数组方法
2021/11/20 Javascript