HTML5连续上传图片

/*
by 的雨
time:2016/11/17
*/
function update_object()
{
	//这是在实例化的时候,同时调用int方法
	this.int.apply(this,arguments);
}
//这是原型链 == 一个对象
update_object.prototype={
	int:function(options)
	{
		//这是接收从调用的时候传过来参数
		this.CC=options.CC;
		this.tishi=options.tishi;
		this.BB=options.BB;
		this.show=options.show;
		this.myfile=options.myfile;
		this.array=[];
		var that=this;
		this.btn=options.btn;
		this.myfile.onchange=function()   //input发生改变的时候触发(onchange事件)
		{
			//第一步骤,这个步骤是找到file,即上传的文件
			var files = this.files;
			/*
			concat() 方法用于连接两个或多个数组。 把that.filter(files)添加到that.array,这样that.array就会不断的保存file数组
			该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
			*/
			that.array=that.array.concat(that.filter(files));
			that.Index();
			return this;
		}
		//这是点击上传的步骤
		this.btn.onclick=function(e)
		{
			that.array;
			var e=e||event;
			e.preventDefault();
			//点击的同时调用上传的方法
			that.upload();
		}

	},
	//第二步骤,这是过滤file的步骤,这一步在concat之前就调用
	filter: function(files) {
		var arrFiles=[];
		for (var i = 0, file; file = files[i]; i++) {
			if (file.type.indexOf("image") == 0) {
				//if (file.size >= 512000) {
				////	alert(‘您这张"‘+ file.name +‘"图片大小过大,应小于500k‘);
				//} else {
					arrFiles.push(file);
				//}
			} else {
				alert(‘文件"‘ + file.name + ‘"不是图片。‘);
			}
		}
		return arrFiles	;
	},
	//第三步骤,这是为每个file添加索引,在concat连接之后调用,把之前的this.array的内容改变了
	Index: function() {

		for (var i = 0, file; file = this.array[i]; i++) {
			//增加唯一索引值
			file.index = i;
		}
		//这里的this.array已经有索引
		this.onSelect(this.array);
		return this;
	},
	//第四步骤,是生成img预览和删除预览
	onSelect: function(files) {
		var that=this;
		var html = ‘‘, i = 0;

		//动态创建img和li
		var show1 = function() 
		{

			file = files[i];

			if (file){
				//var reader = new FileReader()
				var URL=window.URL.createObjectURL(file)
				//reader.onload = function(e) 
				//{
					html+=‘<li ><div id="jindu">上传成功</div><img id="pic_‘ + i + ‘" src=‘+URL+‘><span id="name_‘+ i +‘" class="upload_append_list">‘+file.name+‘</span><a href="#" id="del" title="删除" index="‘+ i +‘">×</a></li>‘;
					//console.log(file);
					i++;
					show1();
					that.show.style.display=‘block‘;
					that.show.innerHTML=html;	

				//}
				//reader.readAsDataURL(file);e.target.result
			} 
		};
		show1();

		//这是删除预览,同时把已经删除的file的索引传到下一个数组
		var del=function()
		{
			if (this.show.hasChildNodes()) {
			var Li=this.show.getElementsByTagName(‘li‘);
			var length=this.show.childNodes.length;
			for(var i=0;i<length;i++)
			{

				Li[i].onmouseover=function()
				{
					this.lastChild.style.display=‘block‘;
					this.lastChild.onclick=function()
					{
						this.parentNode.parentNode.removeChild(this.parentNode);
						var a=this.getAttribute("index"); //这一步找到索引,因为file和a索引都是一样,找到a等于找到file
						that.picdelete(files[a]);  //这部分已经是删除的file,传递到下一个数组
					}
				}	

				Li[i].onmouseout=aa=function()
			{

				this.lastChild.style.display=‘none‘;

			}
			}
			}
		}
		del();
	},
	//第五步骤,这是删除选择的file的步骤
	picdelete:function(a)
	{

		var arr=[];
		for(var i=0,file;file=this.array[i];i++)
		{
			if(a!==file) //遍历this.array找到和a相同的,就不要把它保存到数组
			{
				arr.push(file);
			}
		}
		this.array=arr;  //把最后的file对象内容重新赋值给this.array(已不是刚开始的那个值)

	},
	//第六步骤,这是上传的
	upload:function()
	{
		//this.array是对象,不是数组
		var that=this; 
		var formData = new FormData();  //这是HTML5的上传,能够上传图片和文字
		var aaaa
		//这一步,把所有的this.array都转换为二维数组,例file1,file2,file3,方便最后一步全部上传,不用每循环一次就上传一次
		for (var i = 0, file; file = this.array[i]; i++) {
			formData.append("file"+i,file);	 //要加i否则就会被覆盖,只有最后一个值
			//aaaa=i;console.log(i);
		}

			aaaa=aaaa+1;
			 var xhr = new XMLHttpRequest();
			 //这这部分是显示上传进度条的
			xhr.upload.onprogress=function(evt)
			{
				var lod=evt.loaded;   //已经上传的大小
				var to=evt.total;   //总的大小
				var per=Math.floor(((lod/to))*100)+"%";
				that.tishi.style.display=‘block‘;
				that.tishi.innerHTML=‘你上传了‘+(aaaa*Math.floor(((lod/to))))+‘张照片;‘+‘已经上传‘+per;
				if(per==‘100%‘)
				{
					var Li=that.show.childNodes;
					for(var i=0;i<Li.length;i++)
					{
						Li[i].firstChild.style.display=‘block‘;
						Li[i].onmouseover=function()
						{
							this.lastChild.style.display=‘none‘;
						}
					}
				}
			}
			//接收后台返回来的数据
        	xhr.onreadystatechange = function(){
            if(xhr.readyState==4&&xhr.status==200){
               console.log(xhr.responseText)
            }
       		 }
        	xhr.open(‘POST‘,‘check.php‘,true);
        	//xhr.setRequestHeader(‘Content-Type‘, ‘application/x-www-form-urlencoded‘);
        	xhr.send(formData);
			//传过去的值,用$_FILES接受,相当于直接表单提交
	/*
	步骤
	1,先找到file文件,过滤后用新的数组连接成一个数组
	2,为每个file添加一个i值。就是索引;
	3,从得到索引的file遍历处理,动态创建img
	4,删除事件,把选择删除的file传递到下一级
	5,重新组合file组合,重新遍历,不保存上级带有删除的file
	6,最后得到的是确定要上传的file组合,一般和开始的数组不一样

	*/
	}
}

这是调用的

<script>
window.onload=function()
{
	var CC=document.getElementById(‘cc‘);
	var BB=document.getElementById(‘bb‘);
	var tishi=document.getElementById(‘tishi‘);
	var show=document.getElementById(‘show‘);
	var myfile=document.getElementById(‘myfile‘);
	var btn=document.getElementById(‘submit‘);
	var update=new update_object(
	{
		CC:CC,
		BB:BB,
		tishi:tishi,
		show:show,
		myfile:myfile,
		btn:btn
	}
	);

}
</script>
<form action="check.php"  method="post" enctype="multipart/form-data">
<div id="aa">

	<div id=bb>
    <label>
    	<div id="cc" title="上传图片">上传图片</div>
        <input type="file" id="myfile" name=‘name[]‘ accept="image/jpeg,image/jpg,image/png,image/gif" style=" display:none"  multiple=‘true‘> 
     </label>
    </div> 
    <div id="size">
    <div  id="tishi">
    </div>
    <label>
    <div id="begin">开始上传</div>
    <input id=‘submit‘ type="submit" style="display:none" value="">
    </label>
    </div>
    <ul id="show">
    </ul>
</div>
<input id=‘submit‘ type="submit" value="提交">
</form>

个人是新手,所以写的代码不规范,还请多多包涵。我也是在网上找了很久,找不到全是纯JavaScript写的,所以想把这篇,让新手学习。

时间: 2024-07-30 13:40:37

HTML5连续上传图片的相关文章

利用html5实现上传图片预览

在HTML5中,通过FileReader可以轻松的实现这个功能. 只要在<input type="file" />文件表单元素中监听 onchange 事件,然后通过FileReader读取图片文件,然后将读取的内容在<img>中显示即可. 实现代码 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8" /

jquery html5 file 上传图片显示图片

最近做了一个小例子,在上传用户图像时,如何在上传图片时显示图片.在网上找了很多资料也未能如愿,如是,就用jquery ,html5,实现了,由于开发是在linux 所以未能在ie下测试,在forefox,chrom下是可以的. 一.html下的代码是: <div class=' input_box' > <span class='spac' >头</span>相:<input class="input_style" id="'head

html5中上传图片

从相册中选择图片上传 function uploadFromAlbum(type) { var dirtype = ""; if ("pick_store_license" == type || "pick_id_pic" == type) { dirtype = "auth"; } if ("pick_store_pic" == type) { dirtype = "store"; }

html5异步上传图片显示上传文件进度条

<html> <head> </head> <body> <p> emo_album_id:<input type="text" name="emo_album_id" id="emo_album_id" value='1'> </p> <p> name:<input type="text" name="title&

HTML5拍照上传图片

html <span class="iconfont scan" @click="scan"> <input ref="camera" type="file" @change="toBase64(event)" style="position: absolute;top:50rem" accept="image/*" capture="ca

jqm文件上传,上传图片,jqm的表单操作,jqm的ajax的使用,jqm文件操作大全,文件操作demo

最近在论坛中看到,在使用html5中上传图片或文件,出现各种问题.这一方面,我也一直没有做过,今天就抽出了一点时间来学习一下.现在的示例已经ok了,我就给大家分享一下,希望对大家有帮助. 好吧,我们先看看效果截图吧: 还行吧,来看页面代码: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <h

html5图片异步上传/ 表单提交相关

1 form 表单 get/post提交时候. action地址(或者啥ajax的url地址) 会涉及到跨域问题 常见跨域问题http://www.cnblogs.com/rainman/archive/2011/02/20/1959325.html 举例: 第一种写法 相对路径 $.get('localhost:8080/test_upload/aservlet', { }, function (data) { }); test_upload 为项目名 这里写的为相对路径,不会出现问题 第二种

基于HTML5多图片Ajax上传可预览

html5多图控件<input id="fileImage" type="file" size="30" name="files[]" multiple /> multiple 这个input的特性是html5新有的,所以IE6这么低级的货是无法兼容的. 这个属性相当于以前的这样的多图情况 <input id="fileImage" type="file" size=&

8年javascript知识点积累

08年毕业就开始接触javascript,当时是做asp.net发现很多功能用asp.net控件解决不了,比如checkbox单选,全选问题,自动计算总价问题,刷新问题,等等.那时感觉javascript好讨厌,没有好的框架和调试工具,痛不欲生.如今javascript框架漫天飞舞,jquery,zepto,AngularJs,各种应用层出不穷,动画,游戏,单页网站,甚至手机app,那里都少不了javascript,不禁感叹,还有没有javascript不能做的事情么? 8年了,如今多半时间是管