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 相关文章推荐
Extjs grid panel自带滚动条失效的解决方法
Sep 11 Javascript
JS实现FLASH幻灯片图片切换效果的方法
Mar 04 Javascript
jquery动画效果学习笔记(8种效果)
Nov 13 Javascript
jQuery Easyui datagrid/treegrid 清空数据
Jul 09 Javascript
BootStrap select2 动态改变值的方法
Feb 10 Javascript
详解打造 Vue.js 可复用组件
Mar 24 Javascript
JS获取日期的方法实例【昨天,今天,明天,前n天,后n天的日期】
Sep 28 Javascript
javaScript实现鼠标在文字上悬浮时弹出悬浮层效果
Apr 12 Javascript
JS中的一些常用的函数式编程术语
Jun 15 Javascript
JavaScript中如何对多维数组(矩阵)去重的实现
Dec 04 Javascript
原生js实现文件上传、下载、封装等实例方法
Jan 05 Javascript
JavaScript享元模式原理与用法实例详解
Mar 09 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
如何使用Linux的Crontab定时执行PHP脚本的方法
2011/12/19 PHP
PHP的MVC模式实现原理分析(一相简单的MVC框架范例)
2014/04/29 PHP
PHP  实现等比压缩图片尺寸和大小实例代码
2016/10/08 PHP
PHP面向对象自动加载机制原理与用法分析
2016/10/14 PHP
CodeIgniter框架数据库基本操作示例
2018/05/24 PHP
GreyBox技术总结(转)
2010/11/23 Javascript
js 优化次数过多的循环 考虑到性能问题
2011/03/05 Javascript
JS 去前后空格大全(IE9亲测)
2013/07/15 Javascript
JQuery判断HTML元素是否存在的两种解决方法
2013/12/26 Javascript
深入理解node exports和module.exports区别
2016/06/01 Javascript
深入理解Javascript中的自执行匿名函数
2016/06/03 Javascript
jQuery常见的选择器及用法介绍
2016/12/20 Javascript
jQuery 控制文本框自动缩小字体填充
2017/06/16 jQuery
nodejs使用express获取get和post传值及session验证的方法
2017/11/09 NodeJs
Vue-cli项目获取本地json文件数据的实例
2018/03/07 Javascript
Vue.js 无限滚动列表性能优化方案
2019/12/02 Javascript
vue相同路由跳转强制刷新该路由组件操作
2020/08/05 Javascript
JavaScript中Object、map、weakmap的区别分析
2020/12/15 Javascript
[57:18]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#3VP VS VG
2016/03/03 DOTA
Python中还原JavaScript的escape函数编码后字符串的方法
2014/08/22 Python
详解Python中映射类型(字典)操作符的概念和使用
2015/08/19 Python
Caffe均值文件mean.binaryproto转mean.npy的方法
2018/07/09 Python
python的pytest框架之命令行参数详解(下)
2019/06/27 Python
浅谈图像处理中掩膜(mask)的意义
2020/02/19 Python
python 在threading中如何处理主进程和子线程的关系
2020/04/25 Python
Python如何实现自带HTTP文件传输服务
2020/07/08 Python
Python读取yaml文件的详细教程
2020/07/21 Python
python 实现客户端与服务端的通信
2020/12/23 Python
详解pandas映射与数据转换
2021/01/22 Python
CSS3正方体旋转示例代码
2013/08/08 HTML / CSS
HTML5 Video标签的属性、方法和事件汇总介绍
2015/04/24 HTML / CSS
汽车销售求职自荐信
2013/10/01 职场文书
艺术学院毕业生自荐信
2014/07/05 职场文书
面试中老生常谈的MySQL问答集锦夯实基础
2022/03/13 MySQL
「睡美人」爱洛公主粘土人开订
2022/03/22 日漫
springboot读取resources下文件的方式详解
2022/06/21 Java/Android