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 相关文章推荐
ajax异步刷新实现更新数据库
Dec 03 Javascript
js onload处理html页面加载之后的事件
Oct 30 Javascript
浅谈EasyUI中编辑treegrid的方法
Mar 01 Javascript
浅谈jQuery.easyui的datebox格式化时间
Jun 25 Javascript
学习JavaScript设计模式之享元模式
Jan 18 Javascript
javascript实现可键盘控制的抽奖系统
Mar 10 Javascript
Bootstrap3制作搜索框样式的方法
Jul 11 Javascript
JS实现的手机端精简幻灯片效果
Sep 05 Javascript
微信小程序教程之本地图片上传(leancloud)实例详解
Nov 16 Javascript
JS装饰器函数用法总结
Apr 21 Javascript
基于vue循环列表时点击跳转页面的方法
Aug 31 Javascript
javascript canvas检测小球碰撞
Apr 17 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
德生S2000收音机更换“钕铁硼”全频扬声器
2021/03/02 无线电
PHP mcrypt可逆加密算法分析
2011/07/19 PHP
在PHP中设置、使用、删除Cookie的解决方法
2013/05/06 PHP
PHP使用缓存即时输出内容(output buffering)的方法
2015/08/03 PHP
php结合md5实现的加密解密方法
2016/01/25 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
PHP封装的mysqli数据库操作类示例
2019/02/16 PHP
php-7.3.6 编译安装过程
2020/02/11 PHP
基于PHP实现用户在线状态检测
2020/11/10 PHP
JQuery 插件模板 制作jquery插件的朋友可以参考下
2010/03/17 Javascript
常用的jQuery前端技巧收集
2014/12/24 Javascript
基于Jquery代码实现支持PC端手机端幻灯片代码
2015/11/17 Javascript
javascript返回顶部的按钮实现方法
2016/01/09 Javascript
基于Bootstrap3表格插件和分页插件实例详解
2016/05/17 Javascript
jQuery基于xml格式数据实现模糊查询及分页功能的方法
2016/12/25 Javascript
easyUI combobox实现联动效果
2017/01/17 Javascript
简单谈谈关于Angular Cli打包的事
2017/09/05 Javascript
EasyUI实现下拉框多选功能
2017/11/07 Javascript
vue微信分享 vue实现当前页面分享其他页面
2017/12/02 Javascript
vue+element的表格实现批量删除功能示例代码
2018/08/17 Javascript
ES6基础之默认参数值
2019/02/21 Javascript
python统计一个文本中重复行数的方法
2014/11/19 Python
flask入门之文件上传与邮件发送示例
2018/07/18 Python
Python多线程处理实例详解【单进程/多进程】
2019/01/30 Python
python mac下安装虚拟环境的图文教程
2019/04/12 Python
python requests证书问题解决
2019/09/05 Python
详解在python操作数据库中游标的使用方法
2019/11/12 Python
Python类如何定义私有变量
2020/02/03 Python
在Python IDLE 下调用anaconda中的库教程
2020/03/09 Python
Python如何用wx模块创建文本编辑器
2020/06/07 Python
印度最大的网上花店:Ferns N Petals(鲜花、礼品和蛋糕)
2017/10/16 全球购物
Sasa莎莎海外旗舰店:香港莎莎美妆平台
2018/03/21 全球购物
商务英语求职自荐信范文
2013/12/24 职场文书
装修设计师求职信
2014/02/26 职场文书
python面向对象版学生信息管理系统
2021/06/24 Python
SQL之各种join小结详细讲解
2021/08/04 MySQL