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中判断整字类型最简洁的实现方法
Nov 08 Javascript
微信小程序开发教程-手势解锁实例
Jan 06 Javascript
canvas实现钟表效果
Feb 13 Javascript
Javascript 详解封装from表单数据为json串进行ajax提交
Mar 29 Javascript
AngularJS中ng-class用法实例分析
Jul 06 Javascript
vue单页应用中如何使用jquery的方法示例
Jul 27 jQuery
vue axios整合使用全攻略
May 24 Javascript
Vue引用Swiper4插件无法重写分页器样式的解决方法
Sep 27 Javascript
理理Vue细节(推荐)
Apr 16 Javascript
原生JavaScript之es6中Class的用法分析
Feb 23 Javascript
简单了解three.js 着色器材质
Aug 03 Javascript
jQuery列表动态增加和删除的实现方法
Nov 05 jQuery
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
阿拉伯的咖啡与水烟
2021/03/03 咖啡文化
php网页后退不再出现过期
2007/03/08 PHP
PHP+Memcache实现wordpress访问总数统计(非插件)
2014/07/04 PHP
php array_reverse 以相反的顺序返回数组实例代码
2017/04/11 PHP
jQuery弹出层插件简化版代码下载
2008/10/16 Javascript
javascript学习笔记(十八) 获得页面中的元素代码
2012/06/20 Javascript
js变换显示图片的实例
2013/04/16 Javascript
$.get获取一个文件的内容示例代码
2013/09/11 Javascript
jQuery.holdReady()使用方法
2014/05/20 Javascript
jQuery构造函数init参数分析
2015/05/13 Javascript
深入浅析javascript立即执行函数
2015/10/23 Javascript
Angular中ng-bind和ng-model的区别实例详解
2017/04/10 Javascript
iscroll实现下拉刷新功能
2017/07/18 Javascript
VUE实现表单元素双向绑定(总结)
2017/08/08 Javascript
javascript 日期相减-在线教程(附代码)
2017/08/17 Javascript
AngularJS中controller控制器继承的使用方法
2017/11/03 Javascript
基于node.js实现微信支付退款功能
2017/12/19 Javascript
微信小程序 JS动态修改样式的实现方法
2018/12/16 Javascript
echarts多条折线图动态分层的实现方法
2019/05/24 Javascript
利用JS响应式修改vue实现页面的input值
2019/09/02 Javascript
原生js实现九宫格拖拽换位
2021/01/26 Javascript
js实现简单的倒计时
2021/01/28 Javascript
python利用elaphe制作二维条形码实现代码
2012/05/25 Python
使用 Python 获取 Linux 系统信息的代码
2014/07/13 Python
python中zip和unzip数据的方法
2015/05/27 Python
用python编写第一个IDA插件的实例
2018/05/29 Python
Python文件监听工具pyinotify与watchdog实例
2018/10/15 Python
OpenCV 轮廓检测的实现方法
2019/07/03 Python
Django中的用户身份验证示例详解
2019/08/07 Python
六月份红领巾广播稿
2014/02/03 职场文书
淘宝店铺营销方案
2014/02/13 职场文书
2014年党员教师自我剖析材料
2014/09/30 职场文书
酒店温馨提示语
2015/07/14 职场文书
2016年会领导致辞稿
2015/07/29 职场文书
财务管理制度范本
2015/08/04 职场文书
高一军训口号
2015/12/25 职场文书