视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
js如何实现多图与单图的上传显示
2020-11-03 13:38:57 责编:小采
文档


前言:

项目中经常会大量的使用到图片上传,之前涉及到的时候经常会在网上下载一些素材直接拿过来使用,但是随着项目的增多发现用的是各式各样的,导致非常混乱。所以抽空写了一个DEMO来梳理下图片上传的流畅以及单图和多图上传需要注意的点。

多图上传

多图上传,这里仅仅是做了前端的展示效果,实际项目中,多图上传应该是每次上传一张图片后向后台发送一次请求,后台返回img路径然后进行展现。

(推荐教程:js教程)

为什么一定要传入后台在进行展现呢?

1、如果直接在前台先展现base图片路径,在向后台发送请求。如果接口出现错误后,会给用户产生错觉,以为图片上传成功,而这时后台是没有接收到图片的;

2、file文件每次发生变化,会将之前的files文件给覆盖掉。如果直接展现不用ajax提交后,最终用form提交只会提交最后一张。

<!DOCTYPE html>
<html>
<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>
 <!-- 放图片的位置 -->
 <div id="imgList"></div>
 <!-- 上传按钮 -->
 <div>
 <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]);//将文件转换成base 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上传图片后的显示。具体与后台的一些交互可以根据实际项目中的需求进行增加!

下载本文
显示全文
专题