关闭

html5选择多张图片在页面内预览并上传到后台

2898人阅读 评论(11) 收藏 举报
分类:

需求:点击选择图片(可选多张),确定后将选择的图片显示在页面上,点击提交将图片提交给后台。

效果图:



			    <label>请选择一个图像文件:</label>
			    <input type="file" id="pic_selector" multiple/> <!--multiple,可选择多张图片-->
			    <button>提交</button>

html内容,主要是multiple属性,支持选择多个文件。是HTML5属性,注意兼容问题(IOS支持,安卓不支持)。


js内容:

    function readFile(){
    		dataArr = { data : [] };
    		fd = new FormData();
    		var iLen = this.files.length;
        	for(var i=0;i<iLen;i++){	
            	if (!input['value'].match(/.jpg|.gif|.png|.bmp/i)){  //判断所选文件格式
                	return alert("上传的图片格式不正确,请重新选择");
            	}
	            var reader = new FileReader();
	            fd.append(i,this.files[i]);
	            reader.readAsDataURL(this.files[i]);  //转成base64
	            var fileName = this.files[i].name;
	            reader.onload = function(e){
		            	var imgMsg = {
		            		name : fileName,//获取文件名
		            		base64 : this.result   //reader.readAsDataURL方法执行完后,base64数据储存在reader.result里
		            }
		            	dataArr.data.push(imgMsg);
	                result = '<div style="display:none" class="result" ><img src="'+this.result+'" alt=""/></div>';
	                div = document.createElement('div');
	                div.innerHTML = result;
	                div['className'] = 'float';
	                document.getElementsByTagName('body')[0].appendChild(div);    //插入页面
					var img = div.getElementsByTagName('img')[0];
					img.onload = function(){
						var nowHeight = ReSizePic(this); //设置图片大小
						this.parentNode.style.display = 'block';
						var oParent = this.parentNode;
						if(nowHeight){
							oParent.style.paddingTop = (oParent.offsetHeight - nowHeight)/2 + 'px';
						}
					}
	            }
	        }
    }

以上函数实现选择图片并显示在桌面上,其中img.onload的作用是将选中的图片进行缩放,放在宽高相等的div中并居中显示,可根据自己需求删除这句。

下面附上ReSizePic函数

function ReSizePic(ThisPic) {
	var RePicWidth = 200; //这里修改为您想显示的宽度值

	var TrueWidth = ThisPic.width; //图片实际宽度
	var TrueHeight = ThisPic.height; //图片实际高度
	
	if(TrueWidth>TrueHeight){
		//宽大于高
		var reWidth = RePicWidth;
		ThisPic.width = reWidth;
		//垂直居中
		var nowHeight = TrueHeight * (reWidth/TrueWidth);
		return nowHeight;  //将图片修改后的高度返回,供垂直居中用
	}else{
		//宽小于高
		var reHeight = RePicWidth;
		ThisPic.height = reHeight;
	}
}


以上就实现了图片选择展示,并将所选图片转成base64保存在dataArr中,之后用ajax上传即可。

    function send(){
   		$.ajax({
            url : 'http://...',
            type : 'post',
            data : dataArr,
            dataType: 'json',
            //processData: false,   用FormData传fd时需有这两项
            //contentType: false,
            success : function(data){
                console.log('返回的数据:'+JSON.stringify(data))
           } 
        })
   	}
    
    var oBtn = document.getElementsByTagName('button')[0];
    oBtn.onclick=function(){
    		if(!input.files.length){
    			return alert('请先选择文件');
    		}
  		send();
    }


至于用FormData上传,方法大同小异,这里不再演示了。


下面是完整代码


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>showImages</title>
<style type="text/css">
	.float{
		float:left;
		width : 200;
		height: 200;
		overflow: hidden;
		border: 1px solid #CCCCCC;
		border-radius: 10px;
		padding: 5px;
		margin: 5px;
	}
	img{
		position: relative;
	}
	.result{
		width: 200px;
		height: 200px;
		text-align: center;
		box-sizing: border-box;
	}
	
</style>


<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script type="text/javascript">


window.onload = function(){
    var input = document.getElementById("file_input");
    var result,div;
 
    if(typeof FileReader==='undefined'){
        result.innerHTML = "抱歉,你的浏览器不支持 FileReader";
        input.setAttribute('disabled','disabled');
    }else{
        input.addEventListener('change',readFile,false);
    }     //handler

   
    
    
    var dataArr = null; //直接传base64数据
    var fd = null;  //FormData方式发送请求
    
    function readFile(){
    		dataArr = { data : [] };
    		fd = new FormData();
    		var iLen = this.files.length;
        for(var i=0;i<iLen;i++){
            if (!input['value'].match(/.jpg|.gif|.png|.bmp/i)){  //判断上传文件格式
                return alert("上传的图片格式不正确,请重新选择");
            }
            var reader = new FileReader();
            fd.append(i,this.files[i]);
            reader.readAsDataURL(this.files[i]);  //转成base64
            var fileName = this.files[i].name;
            reader.onload = function(e){
	            	var imgMsg = {
	            		name : fileName,//获取文件名
	            		base64 : this.result   //reader.readAsDataURL方法执行完后,base64数据储存在reader.result里
	            }
	            	dataArr.data.push(imgMsg);
                result = '<div style="display:none" class="result" ><img src="'+this.result+'" alt=""/></div>';
                div = document.createElement('div');
                div.innerHTML = result;
                div['className'] = 'float';
                document.getElementsByTagName('body')[0].appendChild(div);    //插入dom树
				var img = div.getElementsByTagName('img')[0];
				img.onload = function(){
					var nowHeight = ReSizePic(this); //设置图片大小
					this.parentNode.style.display = 'block';
					var oParent = this.parentNode;
					if(nowHeight){
						oParent.style.paddingTop = (oParent.offsetHeight - nowHeight)/2 + 'px';
					}
				}
            }
        }
        
        
    }
    
    
    function send(){
   		$.ajax({
            url : 'http://123.206.89.242:9999',
            type : 'post',
            data : dataArr,
            dataType: 'json',
            //processData: false,   用FormData传fd时需有这两项
            //contentType: false,
            success : function(data){
                console.log('返回的数据:'+JSON.stringify(data))
           } 
        })
   	}
    
    var oBtn = document.getElementsByTagName('button')[0];
    oBtn.onclick=function(){
    		if(!input.files.length){
    			return alert('请先选择文件');
    		}
  		send();
    }
}
/*
 用ajax发送fd参数时要告诉jQuery不要去处理发送的数据,
 不要去设置Content-Type请求头才可以发送成功,否则会报“Illegal invocation”的错误,
 也就是非法调用,所以要加上“processData: false,contentType: false,”
 * */

			
function ReSizePic(ThisPic) {
	var RePicWidth = 200; //这里修改为您想显示的宽度值

	var TrueWidth = ThisPic.width; //图片实际宽度
	var TrueHeight = ThisPic.height; //图片实际高度
	
	if(TrueWidth>TrueHeight){
		//宽大于高
		var reWidth = RePicWidth;
		ThisPic.width = reWidth;
		//垂直居中
		var nowHeight = TrueHeight * (reWidth/TrueWidth);
		return nowHeight;  //将图片修改后的高度返回,供垂直居中用
	}else{
		//宽小于高
		var reHeight = RePicWidth;
		ThisPic.height = reHeight;
	}
}


			
</script>
</head>
	<body ng-controller="Aaa" >
			<div class="container">
			    <label>请选择一个图像文件:</label>
			    <input type="file" id="file_input" multiple/> <!--用input标签并选择type=file,记得带上multiple,不然就只能单选图片了-->
			    <button>提交</button>
			</div>
	</body>
</html>



1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

html5图片上传与预览实现

最近做项目需要用到图片上传与预览功能,由于是用于手机端,所以研究了下H5的实现方式。图片预览首先,解决图片预览问题。在html5中,提供了FileReader来读取本地文件,使我们可以实现图片预览功能...
  • a4307515
  • a4307515
  • 2016-01-12 16:38
  • 32778

js前端实现多图图片上传预览的两个方法

一、将图片转成icon码的实现方式 html代码:
  • hj960511
  • hj960511
  • 2016-06-20 15:36
  • 39414

html页面上传图片并进行展示

html页面: 本功能实现图片上传并显示,点击“查看”按钮也显示图片 缩略图 @ if (!isEmpty(news.thumbnail_atta_id)) { 查看 ...
  • paradisesunny
  • paradisesunny
  • 2015-06-05 15:31
  • 13462

html多图片上传并在线预览

  • 2015-01-10 13:30
  • 5KB
  • 下载

HTML多图预览上传

因为工作的原因一直没时间来记录一下博客,今天抽空来记录一下自己这几个月以来碰到的问题,这一段时间以来一直咳客户端,服务端,前端,还有数据库打交道,所以碰到的问题蛮多的,在这里只是发表自己的一些解决办法...
  • lx1156890717
  • lx1156890717
  • 2016-12-14 16:47
  • 432

html选择本地图片即时预览

最近在做一个.net mvc的网站,想让用户在网页中上传图片的过程中预览图片,本以为很简单,以为可以直接在html中解决,百度了很多才发现貌似挺麻烦,综合一些大神的回答,总结了一下。 完成此类操作,...
  • ccutsoft20144264
  • ccutsoft20144264
  • 2016-06-28 23:49
  • 3990

js实现上传多个图片或者多个文件

主要是运用html5的    filereader可以参考  http://blog.csdn.net/yaoyuan_difang/article/details/38582697FileReade...
  • lu_tu_zhong
  • lu_tu_zhong
  • 2017-01-18 18:13
  • 9440

js实现前台多张图片上传及预览

1.上传图片时简单预览和删除功能。预览时,不需传后台,上传打开的窗口中每次只能选择一张图片,每张图片对应一个input,如果图片被删除,对应的input也需删除,不影响要传后台参数。注:窗口中能多选文...
  • banbianliushui
  • banbianliushui
  • 2016-11-21 15:17
  • 3772

JS上传图片(多图片)

  • 2012-04-16 11:23
  • 77KB
  • 下载

js多图片上传--一次性上传多张

适用各种版本的多图片上传,如果ie上测试有问题那就可能是ie设置有问题 html> html xmlns="http://www.w3.org/1999/xhtml"> head lang="e...
  • luckyJieXu
  • luckyJieXu
  • 2017-05-04 16:07
  • 3013
    个人资料
    • 访问:8426次
    • 积分:220
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:0篇
    • 译文:0篇
    • 评论:11条
    文章分类
    文章存档
    最新评论