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 相关文章推荐
js同时按下两个方向键
Dec 01 Javascript
jquery多选项卡效果实例代码(附效果图)
Mar 23 Javascript
用JavaScript实现动画效果的方法
Jul 20 Javascript
js几秒以后倒计时跳转示例
Dec 26 Javascript
js实现鼠标触发图片抖动效果的方法
Feb 27 Javascript
JS实现为排序好的字符串找出重复行的方法
Mar 02 Javascript
javascript中活灵活现的Array对象详解
Nov 30 Javascript
jQuery实现立体式数字动态增加(animate方法)
Dec 21 Javascript
微信小程序 九宫格实例代码
Jan 21 Javascript
微信小程序日历组件calendar详解及实例
Jun 08 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
Oct 14 Javascript
JavaScript大数相加相乘的实现方法实例
Oct 18 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中使用sftp教程
2015/03/30 PHP
yii权限控制的方法(三种方法)
2015/12/28 PHP
PHP支付系统设计与典型案例分享
2016/08/02 PHP
简单PHP会话(session)说明介绍
2016/08/21 PHP
jQuery+HTML5实现图片上传前预览效果
2015/08/20 Javascript
jQuery实现带分组数据的Table表头排序实例分析
2015/11/24 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
2015/12/23 Javascript
JavaScript中的this机制
2016/01/30 Javascript
Bootstrap编写导航栏和登陆框
2016/05/30 Javascript
javascript实现图片左右滚动效果【可自动滚动,有左右按钮】
2016/09/19 Javascript
Bootstrap下拉菜单样式
2017/02/07 Javascript
详解Vue2.x-directive的学习笔记
2017/07/17 Javascript
Vue.js项目模板搭建图文教程
2017/09/20 Javascript
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
2017/10/21 Javascript
vue element-ui之怎么封装一个自己的组件的详解
2019/05/20 Javascript
vue eslint简要配置教程详解
2019/07/26 Javascript
javascript面向对象程序设计实践常用知识点总结
2019/07/29 Javascript
python的id()函数介绍
2013/02/10 Python
python实时分析日志的一个小脚本分享
2017/05/07 Python
python3 pillow生成简单验证码图片的示例
2017/09/19 Python
利用Tkinter和matplotlib两种方式画饼状图的实例
2017/11/06 Python
selenium+python 去除启动的黑色cmd窗口方法
2018/05/22 Python
Python调用graphviz绘制结构化图形网络示例
2019/11/22 Python
python使用numpy实现直方图反向投影示例
2020/01/17 Python
Keras设定GPU使用内存大小方式(Tensorflow backend)
2020/05/22 Python
Python getattr()函数使用方法代码实例
2020/08/10 Python
python安装第三方库如xlrd的方法
2020/10/31 Python
selenium框架中driver.close()和driver.quit()关闭浏览器
2020/12/08 Python
css3的transition属性详解
2014/12/15 HTML / CSS
Ticketmaster德国票务网站:购买音乐会和体育等门票
2016/11/14 全球购物
Chemist Warehouse官方海外旗舰店:澳洲第一连锁大药房
2017/08/25 全球购物
英国在线购买马术服装:EQUUS
2019/07/12 全球购物
应届毕业生就业自荐信
2013/10/26 职场文书
关于读书的演讲稿1000字
2014/08/27 职场文书
人事任命通知书
2015/04/21 职场文书
解决WINDOWS电脑开机后桌面没有任何图标
2022/04/09 数码科技