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 相关文章推荐
PHP 与 js的通信(via ajax,json)
Nov 16 Javascript
从数据结构的角度分析 for each in 比 for in 快的多
Jul 07 Javascript
不使用浏览器运行javascript代码的方法
Jul 24 Javascript
判断一个对象是否为jquery对象的方法
Mar 12 Javascript
jQuery中:checked选择器用法实例
Jan 04 Javascript
jquery动感漂浮导航菜单代码分享
Apr 15 Javascript
js实现创建删除html元素小结
Sep 30 Javascript
jQuery validate插件实现ajax验证重复的2种方法
Jan 22 Javascript
checkbox:click事件触发span元素内容改变的方法
Sep 11 Javascript
详解JS函数stack size计算方法
Jun 18 Javascript
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
Jan 18 Javascript
vue中的 $slot 获取插槽的节点实例
Nov 12 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中动态显示签名和ip原理
2007/03/28 PHP
PHP错误WARNING: SESSION_START() [FUNCTION.SESSION-START]解决方法
2014/05/04 PHP
PHP模块memcached使用指南
2014/12/08 PHP
一波PHP中cURL库的常见用法代码示例
2016/05/06 PHP
js中的值类型和引用类型小结 文字说明与实例
2010/12/12 Javascript
JavaScript简单实现网页回到顶部功能
2013/11/12 Javascript
jquery跨域请求示例分享(jquery发送ajax请求)
2014/03/25 Javascript
微信小程序 仿美团分类菜单 swiper分类菜单
2017/04/12 Javascript
详解Angular4 路由设置相关
2017/08/26 Javascript
详解Angular6.0使用路由步骤(共7步)
2018/06/29 Javascript
vue-router的使用方法及含参数的配置方法
2018/11/13 Javascript
javascript面向对象三大特征之封装实例详解
2019/07/24 Javascript
Vue基于iview实现登录密码的显示与隐藏功能
2020/03/06 Javascript
JS中的const命令你真懂它吗
2020/03/08 Javascript
[06:07]刀塔密之二:攻之吾命受之吾幸
2014/07/03 DOTA
[19:54]夜魇凡尔赛茶话会 第一期02:看图识人
2021/03/11 DOTA
python连接oracle数据库实例
2014/10/17 Python
Python中模块pymysql查询结果后如何获取字段列表
2017/06/05 Python
详解python中executemany和序列的使用方法
2017/08/12 Python
Python环境搭建之OpenCV的步骤方法
2017/10/20 Python
Python实现高斯函数的三维显示方法
2018/12/29 Python
Django框架获取form表单数据方式总结
2020/04/22 Python
python异常处理之try finally不报错的原因
2020/05/18 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
2020/06/24 Python
PyTorch如何搭建一个简单的网络
2020/08/24 Python
阻止移动设备(手机、pad)浏览器双击放大网页的方法
2014/06/03 HTML / CSS
Unineed中文官网:高端护肤美妆与时尚配饰,英国直邮
2020/07/23 全球购物
必须要使用游标的SQL语句有那些
2012/05/07 面试题
大专生自我鉴定范文
2013/10/01 职场文书
代办委托书怎样写
2014/04/08 职场文书
保护黄河倡议书
2014/05/16 职场文书
阿甘正传观后感
2015/06/01 职场文书
Java 泛型详解(超详细的java泛型方法解析)
2021/07/02 Java/Android
Python利用zhdate模块实现农历日期处理
2022/03/31 Python
win10如何更改appdata文件夹的默认位置?
2022/07/15 数码科技
Shell中的单中括号和双中括号的用法详解
2022/12/24 Servers