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 Xml增删改查(IE下)操作实现代码
Jan 30 Javascript
JavaScript Serializer序列化时间处理示例
Jul 31 Javascript
不定义JQuery插件 不要说会JQuery
Mar 07 Javascript
Node.js插件安装图文教程
May 06 Javascript
jQuery操作iframe中js函数的方法小结
Jul 06 Javascript
wap手机端解决返回上一页的js实例
Dec 08 Javascript
jquery.guide.js新版上线操作向导镂空提示jQuery插件(推荐)
May 20 jQuery
详解为生产环境编译Angular2应用的方法
Dec 10 Javascript
webpack优化的深入理解
Dec 10 Javascript
详解如何使用router-link对象方式传递参数?
May 02 Javascript
javascript中this的用法实践分析
Jul 29 Javascript
JS封装cavans多种滤镜组件
Feb 15 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获取文件类型和文件信息的方法
2015/07/10 PHP
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
PHP 图片处理
2020/09/16 PHP
javascript 手动给表增加数据的小例子
2013/07/10 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
iframe里使用JavaScript控制主页转向的方法
2015/04/03 Javascript
js图片轮播特效代码分享
2015/09/07 Javascript
JS获取数组最大值、最小值及长度的方法
2015/11/24 Javascript
vue2.0开发实践总结之入门篇
2016/12/06 Javascript
jQuery使用ajax方法解析返回的json数据功能示例
2017/01/10 Javascript
JavaScript自动点击链接 防止绕过浏览器访问的方法
2017/01/19 Javascript
jQuery实现Table表格隔行变色及高亮显示当前选择行效果示例
2017/02/14 Javascript
完美实现js焦点轮播效果(二)(图片可滚动)
2017/03/07 Javascript
vue.js移动端app之上拉加载以及下拉刷新实战
2017/09/11 Javascript
Bootstrap 中data-[*] 属性的整理
2018/03/13 Javascript
vue实现未登录跳转到登录页面的方法
2018/07/17 Javascript
微信小程序自定义组件的实现方法及自定义组件与页面间的数据传递问题
2018/10/09 Javascript
微信小程序实现随机验证码功能
2018/12/20 Javascript
一文秒懂nodejs中的异步编程
2021/01/28 NodeJs
[50:34]VGJ.T vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[54:26]完美世界DOTA2联赛PWL S3 Forest vs Rebirth 第一场 12.10
2020/12/12 DOTA
举例讲解Django中数据模型访问外键值的方法
2015/07/21 Python
CentOS 7下Python 2.7升级至Python3.6.1的实战教程
2017/07/06 Python
如何运行.ipynb文件的图文讲解
2019/06/27 Python
Python企业编码生成系统总体系统设计概述
2019/07/26 Python
python使用itchat模块给心爱的人每天发天气预报
2019/11/25 Python
快速解决jupyter启动卡死的问题
2020/04/10 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
2020/06/10 Python
Pandas数据分析的一些常用小技巧
2021/02/07 Python
英国领先的奢侈品零售商之一:CRUISE
2016/12/02 全球购物
荷兰游戏商店:Allyouplay
2019/03/16 全球购物
static关键字的用法
2013/10/07 面试题
医院办公室主任职责
2013/12/29 职场文书
护理专业学生职业生涯规划范文
2014/03/11 职场文书
工商局所长四风自我剖析及整改措施
2014/10/26 职场文书
应收账款管理制度
2015/08/06 职场文书