jquery ajax多图上传显示怎么写

发布网友 发布时间:2022-04-19 20:08

我来回答

2个回答

懂视网 时间:2022-04-29 11:24

前言:

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

多图上传

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

(推荐教程:js教程)

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

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

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]);//将文件转换成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上传图片后的显示。具体与后台的一些交互可以根据实际项目中的需求进行增加!

热心网友 时间:2022-04-29 08:32

首先我们在页面上放置个上传按钮,使用POST提交到ajax.php。#ul_pics 用来显示上传完毕后的图片。
<a class="btn" id="btn">上传图片</a> 最大500KB,支持jpg,gif,png格式。
<ul id="ul_pics" class="ul_pics clearfix"></ul>
接着,加载jQuery.js和plupload.full.min.js插件。
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="plupload/plupload.full.min.js"></script>
当点击按钮“上传图片”后,弹出选择文件对话框,按 "ctrl" 选择多图片上传。然后调用 uploader.start() 方法,开始上传。上传中间过程我们可以用 UploadProgress 方法来显示文件进度,最后通过 FileUploaded 来显示对应的图片。通过浏览器控制台,会发现上传一张图片,会向后台ajax.php请求一次。
var uploader = new plupload.Uploader({ //创建实例的构造方法
runtimes: 'html5,flash,silverlight,html4',
//上传插件初始化选用那种方式的优先级顺序
browse_button: 'btn',
// 上传按钮
url: "ajax.php",
//远程上传地址
flash_swf_url: 'plupload/Moxie.swf',
//flash文件地址
silverlight_xap_url: 'plupload/Moxie.xap',
//silverlight文件地址
filters: {
max_file_size: '500kb',
//最大上传文件大小(格式100b, 10kb, 10mb, 1gb)
mime_types: [ //允许文件上传类型
{
title: "files",
extensions: "jpg,png,gif"
}]
},
multi_selection: true,
//true:ctrl多文件上传, false 单文件上传
init: {
FilesAdded: function(up, files) { //文件上传前
if ($("#ul_pics").children("li").length > 30) {
alert("您上传的图片太多了!");
uploader.destroy();
} else {
var li = '';
plupload.each(files,
function(file) { //遍历文件
li += "<li id='" + file['id'] + "'><div class='progress'><span class='bar'></span><span class='percent'>0%</span></div></li>";
});
$("#ul_pics").append(li);
uploader.start();
}
},
UploadProgress: function(up, file) { //上传中,显示进度条
$("#" + file.id).find('.bar').css({
"width": file.percent + "%"
}).find(".percent").text(file.percent + "%");
},
FileUploaded: function(up, file, info) { //文件上传成功的时候触发
var data = JSON.parse(info.response);
$("#" + file.id).html("<div class='img'><img src='" + data.pic + "'/></div><p>" + data.name + "</p>");
},
Error: function(up, err) { //上传出错的时候触发
alert(err.message);
}
}
});
uploader.init();
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com