本文实例介绍了js结合HTML5 Ajax实现文件上传进度条功能,分享给大家供大家参考,具体内容如下
1. lib.js
var Host = window.location.host; //--Cookie function setCookie(name,value) { var Days = 30; var exp = new Date(); exp.setTime(exp.getTime() + Days*24*60*60*1000); document.cookie = name + \'=\'+ escape (value) + \';expires=\' + exp.toGMTString(); } function getCookie(name) { var arr,reg=new RegExp(\'(^| )\'+name+\'=([^;]*)(;|$)\'); if(arr=document.cookie.match(reg)) return unescape(arr[2]); else return null; } //--Dom & String var get = { //-- 获得Dom Id Id:function(obj) { return is.object(obj) ? obj : (document.getElementById(obj)); }, //--获得Body body:function() { return document.body; }, //-- 通过Html 标签取对象 Tag:function(obj, Tagname) { return obj.getElementsByTagName(Tagname); }, //-- 通过Name 来取对象 Name:function (Name) { return document.getElementsByName(Name); }, //-- Url编码转换 encode:function (str) { return encodeURIComponent(str); }, filepath:function (obj,callback) { window.URL = window.URL || window.webkitURL; img = new Image(); var reader = new FileReader(); reader.readAsDataURL(get.Id(obj).files[0]); reader.onload = function(e){ callback(this.result); source = this.result; } // return window.URL.createObjectURL(get.Id(obj).files[0]); } } var set = { //-- url 跳转 url:function(URL) { window.location.href = URL; }, //-- 页面刷新 reload:function() { window.location.reload(); }, //-- 动态设置 标签内容 @ obj 为标签内容,text 为内容 html:function (obj, text) { obj.innerHTML = text; } } var string = { //-- 将字符转换成Json toJson:function(str) { return eval(\'(\'+str+\')\'); }, //-- 不区分大小写判断 相等true , eqlower:function(str1, str2) { if(str1.toLowerCase() == str2.toLowerCase()){ return true; } return false; } } var is = { //-- 是否是IE浏览器,用此来判断是否支持HTML5,低于IE10的返回false,由于 IE采用 V8 JavaScript引擎 html5:function () { return (!/*@cc_on!@*/~0x1111111111111111) ? false : true; }, //--验证身份证,并且返回身份证,性别,住址,年龄 Card:function (sId) { var card_area={ 11:\'北京\', 12:\'天津\', 13:\'河北\', 14:\'山西\', 21:\'辽宁\', 15:\'内蒙古\', 22:\'吉林\', 31:\'上海\', 32:\'江苏\', 33:\'浙江\', 34:\'安徽\', 23:\'黑龙江\', 35:\'福建\', 36:\'江西\', 37:\'山东\', 41:\'河南\', 42:\'湖北\', 43:\'湖南\', 44:\'广东\', 45:\'广西\', 46:\'海南\', 50:\'重庆\', 51:\'四川\', 52:\'贵州\', 53:\'云南\', 54:\'西藏\', 61:\'陕西\', 62:\'甘肃\', 63:\'青海\', 64:\'宁夏\', 65:\'新疆\', 71:\'台湾\', 81:\'香港\', 82:\'澳门\', 91:\'国外\' }; var iSum=0 var info=\'\' var card_info=Array(2); var error = \'\'; sId=sId.replace(/x$/i,\'a\'); if (sId.length==0){ error = \'请填写你的身份证\'; return false; } if (null == card_area[parseInt(sId.substr(0,2))]) { error = \'非法证件你的地区填写有错误请仔细填写\'; return false; } sBirthday=sId.substr(6,4)+\'-\'+Number(sId.substr(10,2)) + \'-\'+Number(sId.substr(12,2)); var d = new Date(sBirthday.replace(/-/g,\'/\')); if (sBirthday!=(d.getFullYear()+\'-\'+ (d.getMonth()+1) + \'-\' + d.getDate())) { error = \'非法证件你的生日填写有错误请仔细填写\'; return false; } for(var i = 17; i>=0; i--) { iSum += (Math.pow(2,i) % 11) * parseInt(sId.charAt(17 - i),11) } if (1 != iSum%11) { error = \'非法证号你确认你是地球人请认真填写哦~~~~\'; return false; } if (sId.length>19){ error = \'你确认你的身份证是有效证件?\'; return false; } card_info[0] = card_area[parseInt(sId.substr(0, 2))]; card_info[1] = sBirthday; card_info[2] = sId.substr(16, 1) % 2 ? \'男\' : \'女\'; return card_info; }, //--获取变量的类型, object,string,int.....等 type:function(type) { if(is.object(type)) { return \'object\'; }else if (is.string(type)) { return \'string\'; }else if (is.int(type)) { return \'int\'; }else if (is.double(type)) { return \'double\'; }else { return \'null\'; } }, //-- 变量是否是对象,返回 true|false object:function(type) { return \'object\' == typeof(type) ? true:false; }, //-- 变量是否是字符串 , 返回 true|false string:function(type) { return \'string\' == typeof(type) ? true:false; }, //-- 变量是否是整型,返回 true|false int:function(type) { if (\'number\' == typeof(type)) { if(0 > type.toString().indexOf(\'.\')) { return true; } } return false; }, //-- 变量是否是小数,返回 true|false double:function(type) { if(\'number\' == typeof(type)) { if (0<=type.toString().indexOf(\'.\')) { return true; } } return false; } } var file = { //--异步文件上传 upload:function (json) { var post = new XMLHttpRequest(); var FLIE = new Object(); var json = is.object(json) ? json : string.toJson(json); var dataType = string.eqlower(json.dataType,\'json\') ? true : false; var fileSize = 0; if(!json.url&&json.error) { json.error(404); return; } if(!is.object(json.file)) { FLIE.id = get.Id(json.file); //-- 大文件处理 if(json.maxfile) { //--文件总大小 fileSize = file.getSize(FLIE.id); //--以2M为单位进行文件切割 shardSize = 1024 * 1024 << 1; //--总片数 shardCount = Math.ceil(fileSize / shardSize); for(var i = 0; i < shardCount; ++i) { //--计算每一片的起始与结束位置 var start = i * shardSize; var end = Math.min(fileSize, start + shardSize); var formData = new FormData(); //--slice方法用于切出文件的一部分 formData.append(json.file, FLIE.id.files[0].slice(start,end)); formData.append(\"total\", shardCount); //总片数 formData.append(\"index\", i + 1); //当前是第几片 post.upload.addEventListener(\'progress\', callback, false); post.open(\'post\', json.url, true); // 异步传输 post.send(formData); post.upload.onprogress = function (ev) { if(file.getProgress(ev) == 100) { json.success(ev); } } } }else { var formData = new FormData(); formData.append(json.file, FLIE.id.files[0]); if (json.progress) { post.upload.addEventListener(\'progress\', json.progress, false); } post.open(\'post\', json.url, true); // 异步传输 post.send(formData); /*post.upload.onprogress = function (ev) { if(file.getProgress(ev) == 100) { json.success(ev); } }*/ post.onreadystatechange = function () { switch (post.readyState) { case 1:{break;} case 2:{break;} case 3:{break;} case 4:{ if (post.status == 200 || post.status == 0) { json.success(string.toJson(post.responseText)); } break; } } } } } }, //-- 获得上传文件的进度值 getProgress:function (evt) { var percentComplete = Math.round(evt.loaded * 100 / evt.total); return percentComplete.toString(); }, //-- 获得文件的大小 getSize:function (file) { var FILE = get.Id(file).files[0]; var fileSize = 0; if (file.size > 1024 * 1024) { fileSize = (Math.round(FILE.size * 100 / (1024 * 1024)) / 100).toString(); } else { fileSize = (Math.round(FILE.size * 100 / 1024) / 100).toString(); } return fileSize; }, //-- 获得文件的类型 getType:function (file) { var FILE = get.Id(file).files[0]; return FILE.type; }, //-- 获得文件的名字 getName:function (file) { var FILE = get.Id(file).files[0]; return FILE.name; }, //--包含文件 include:function (path) { } } //--Ajax数据提交类 var Call = { /** * 参数为json对象|Json字符串, * @type post|get 默认为get ,请求方式 * @url String 字符串型 ,请求地址 * @loading bool true|false 是否开启动画 * @time int 动画时间 如果 loading 为false 则不用设置这个参数 * @data Json | String 提交的数据 * @sucess 回调函数 这个必须有 */ Ajax:function(json){ var json = is.object(json)?json:string.toJson(json); var type = (json.type == undefined) || (json.type == \'\') ? \'get\' : json.type; ; var url = (json.url == undefined) || (json.url == \'\') ? alert(\'请求url不能为空\') : json.url; var loading = (json.Loading == undefined) || (json.Loading == \'\') ? false : json.Loading; var time = (json.time == undefined) || (json.time == \'\') ? 2000 : json.time; var dataType = string.eqlower(json.dataType,\'json\') ? \'json\' : \'string\'; if(loading) { var L = Loading.start(); } var data = \'\'; if(is.object(json.data)) { if(json.data) { for(d in json.data) { data = data + d + \'=\' + json.data[d] + \'&\'; } } if(string.eqlower(json.type,\'get\')) { data =\'?\' + data.substring(0, data.length-1); } }else{ if(json.data.length>=1) { data = json.data.indexOf(\'?\') < 0 ? \'?\'+json.data:json.data+\'\'; } } try { //--IE高版本创建XMLHTTP XMLHttpReq = new ActiveXObject(\'Msxml2.XMLHTTP\'); } catch(E) { try { XMLHttpReq = new ActiveXObject(\'Microsoft.XMLHTTP\');//IE低版本创建XMLHTTP } catch(E) { XMLHttpReq = new XMLHttpRequest();//兼容非IE浏览器,直接创建XMLHTTP对象 } } if(XMLHttpReq) { if (string.eqlower(json.type, \'post\')) { XMLHttpReq.open(\'post\', url, true); XMLHttpReq.setRequestHeader(\'Content-Type\', \'application/x-www-form-urlencoded\'); XMLHttpReq.send(data); }else if (string.eqlower(json.type, \'get\')) { XMLHttpReq.open(\'get\', url+data, true); XMLHttpReq.send(null); } XMLHttpReq.onreadystatechange = function () { switch (XMLHttpReq.readyState) { case 1:{break;} case 2:{break;} case 3:{break;} case 4:{ if (XMLHttpReq.status == 200 || XMLHttpReq.status == 0) { if (loading) { setTimeout(function(){ Loading.stop(L); if(json.dataType == \'json\') json.success(string.toJson(XMLHttpReq.responseText)); else json.success(XMLHttpReq.responseText) }, time*1000); }else { if(json.dataType == \'json\') json.success(string.toJson(XMLHttpReq.responseText)); else json.success(XMLHttpReq.responseText) } } break; } } } } } } var Loading = { //-- Ajax动画 start:function(){ var d = add.Dom(document.body,\'style\'); d.innerHTML = \'@keyframes d{from {left:0px;}to {left:98%;}}\'; var back = add.Dom(document.body, \'div\'); var d0 = add.Dom(back, \'div\'); var d1 = add.Dom(d0, \'div\'); var d2 = add.Dom(d0, \'div\'); var d3 = add.Dom(d0, \'div\'); var d4 = add.Dom(d0, \'div\'); add.Attr(back, \'style\', \'width:100%;height:100%;filter:alpha(opacity=50); -moz-opacity:0.5; opacity:0.5; background:#000; position:fixed; left:0px; top:0px; z-index;1000;\'); add.Attr(d0, \'style\', \'position:relative; top:50%; width:100%; height:30px;\'); add.Attr(d1, \'style\', \'height:15px; width:15px; position:absolute; background:#ABCDEF; animation:d 2s infinite; -moz-border-radius:15px; -webkit-border-radius: 15px; border-radius: 15px 15px 15px 15px; \'); add.Attr(d2, \'style\', \'height:15px; width:15px; position:absolute; background:#ABCDEF; animation:d 3s infinite; -moz-border-radius:15px; -webkit-border-radius: 15px; border-radius: 15px 15px 15px 15px; \'); add.Attr(d3, \'style\', \'height:15px; width:15px; position:absolute; background:#ABCDEF; animation:d 4s infinite; -moz-border-radius:15px; -webkit-border-radius: 15px; border-radius: 15px 15px 15px 15px; \'); add.Attr(d4, \'style\', \'height:15px; width:15px; position:absolute; background:#ABCDEF; animation:d 5s infinite; -moz-border-radius:15px; -webkit-border-radius: 15px; border-radius: 15px 15px 15px 15px; \'); var div = { domback:back, dom0:d0, dom1:d1, dom2:d2, dom3:d3, dom4:d4 } return div; }, //-- Ajax停止动画 stop:function(d) { d.dom0.parentNode.removeChild(d.dom0); d.dom1.parentNode.removeChild(d.dom1); d.dom2.parentNode.removeChild(d.dom2); d.dom3.parentNode.removeChild(d.dom3); d.dom4.parentNode.removeChild(d.dom4); d.domback.parentNode.removeChild(d.domback); } } var del = { Dom:function(obj) { obj.parentNode.removeChild(obj); } } var add = { //--动态添加Dom节点 Dom:function (obj,dom) { var dom = document.createElement(dom); get.Id(obj).appendChild(dom); return dom; }, //-- 动态添加属性 Attr:function(obj,key,value){ obj.setAttribute(key, value); return obj; } } //--URL编码 function url(Str){ return decodeURI(Str); } /** * 模板字符串,语法标签采用<js></js> * 完全遵循javascript原生语法 * @param template * @param vars * @returns {Function} */ function js_template(template, vars) { //唯一分隔标志字符串 var split = \'_{\' + Math.random() + \'}_\'; //消除换行符 var estr = template.replace(/\\n|\\r|\\t/g, \'\'); var js = []; /**** * 匹配标签<js> ...</js>--并且替换为特定的分隔串, * 并将匹配的js代码放入js数组中备用 * */ estr = estr.replace(/<js>(.*?)<\\/js>/g, function ($0, $1) { js.push($1); return split; }); /*根据特定的分隔串分隔得到普通text文本串的数组*/ var text = estr.split(split); estr = \" var output=\'\';\"; /**** * 0101010---0为text[]元素,1为js[]元素 * 重新串起来连接为可执行eval的estr * **/ for (var i = 0; i < js.length; ++i) { estr += \'output+=text[\' + i + \'];\'; estr += js[i]; } estr += \'output+=text[\' + js.length + \'];\'; estr += \'return output;\'; var fun =new Function(\'vars\',\'text\',estr); return function(data){ return fun.apply(null,[data,text]); } }
2. add.html
<!DOCTYPE html> <html> <head> <meta charset=\"utf-8\"> <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><title>Lumino Pro - Dashboard</title> <link href=\"__SOURCE__/css/bootstrap.min.css\" rel=\"stylesheet\"> <link href=\"__SOURCE__/css/datepicker3.css\" rel=\"stylesheet\"> <link href=\"__SOURCE__/css/styles.css\" rel=\"stylesheet\"> <link href=\"__SOURCE__/css/Table.css\" rel=\"stylesheet\"> <link href=\"__SOURCE__/css/dt.css\" rel=\"stylesheet\"> <link href=\"__SOURCE__/css/plus/buttons.css\" rel=\"stylesheet\"> <link href=\"__SOURCE__/css/file.css\" rel=\"stylesheet\"> <link href=\"__SOURCE__/css/webuploader.css\" rel=\"stylesheet\"> <link href=\"__SOURCE__/css/plus/bootstrap-switch.min.css\" rel=\"stylesheet\"> <link href=\'http://fonts.useso.com/css?family=Lato:100,300,400,700,900,100italic,300italic,400italic,700italic,900italic\' rel=\'stylesheet\' type=\'text/css\'> <!--[if lt IE 9]> <link href=\"__SOURCE__/css/rgba-fallback.css\" rel=\"stylesheet\"> <script src=\"__SOURCE__/js/html5shiv.js\"></script> <script src=\"__SOURCE__/js/respond.min.js\"></script> <![endif]--> </head> <body> <include file=\"Apps/Admin/View/include/nav.html\"/> <div id=\"sidebar-collapse\" class=\"col-sm-3 col-lg-2 sidebar\"> <form role=\"search\"> <div class=\"form-group\"> <input type=\"text\" class=\"form-control\" placeholder=\"Search\"> </div> </form> <include file=\"Apps/Admin/View/include/menu.html\"/> </div><!--/.sidebar--> <div class=\"col-sm-9 col-sm-offset-3 col-lg-10 col-lg-offset-2 main\"> <div class=\"row\"> <ol class=\"breadcrumb\"> <li><a href=\"#\"><span class=\"glyphicon glyphicon-home\"></span></a></li> <li class=\"active\">Dashboard</li> </ol> </div> <div class=\"row col-no-gutter-container\"> <div class=\"panel panel-default\"> <div class=\"panel-heading\">Banner添加 <button id=\'up\' type=\"button\" style=\'float:right; margin:4px;\"\' class=\"btn btn-default\"><span class=\"glyphicon glyphicon-plus\"></span>上传</button> <button id=\'add\' type=\"button\" style=\'float:right; margin:4px;\"\' class=\"btn btn-default\"><span class=\"glyphicon glyphicon-plus\"></span>确定添加</button> </div> <div class=\"panel-body\"> <div class=\"canvas-wrapper\"> <form id=\'banner\'> <dl class=\'dt\'> <dd><label>Banner名字</label></dd> <dt> <div class=\"form-group has-success\"> <input name=\'name\' class=\"form-control\" placeholder=\"Banner名字\" value=\'\'> </div> </dt> <div style=\'clear:both;\'></div> <dd><label>Banner类型:</label></dd> <dt> <div class=\"form-group has-warning\"> <select name=\'type\' class=\"form-control\" style=\'background:rgb(31,45,55); color:#FFF;\'> <option value=\'1\' style=\' font-size:18px;\'>首页</option> <option value=\'2\' style=\' font-size:18px;\'>内页广告</option> </select> </div> </dt> <div style=\'clear:both;\'></div> <dd><label>Banner链接地址:</label></dd> <dt> <div class=\"form-group has-warning\"> <input name=\'link\' class=\"form-control\" placeholder=\"Banner链接地址\" value=\'\'> </div> </dt> </dl> <dl class=\'dt\'> <dd><label>Banner上传:</label></dd> <dt> <div class=\"form-group has-warning\"> <input class=\"form-control\" type = \'button\' value=\'选择文件\'> <input id=\'files\' type=\'file\' class=\"file\"> </div> </dt> <div style=\'clear:both;\'></div> <dd><label>文件类型:</label></dd> <dt> <div class=\"form-group has-warning\"> <div id=\'filetype\' class=\'left\' style=\'padding-top:2px;\'></div> </div> </dt> <div style=\'clear:both;\'></div> <dd><label>文件上传进度:</label></dd> <dt> <div class=\'form-control\' style=\'padding:2px; height:26px; overflow:hidden;\'> <!-- <div id=\'progress\' style=\'background:#ABCDEF; width:0px; height:22px;\'></div> --> <progress id=\'progress\' max=\"100\" value=\'0\' style=\'width:100%; height:22px; background:#30a5ff;\'>o(︶︿︶)o</progress> <div id=\'gress\' height:0px; style=\'padding-top:2px; color:#FFF; position:relative; bottom:28px; left:40%;\'></div> </div> <div id=\'fileSize\' class=\'right\' style=\'padding-top:2px;\'> <span class=\'left\'></span> <span></span> </div> </dt> </dl> </form> <div style=\'clear:both;\'></div> <div class=\'fixed-table-container\' style=\'height:244px;\'> <img class=\'left\' id =\'thmb\' src=\'\'> <div> <ul class=\'ul-info\' style=\'display:none;\'> <li><span class=\'left\'>文件大小:</span><p>22222kb</p></li> <li><span class=\'left\'>文件路径:</span><p>22222kb</p></li> <li><span class=\'left\'>图片高度:</span><p>22222kb</p></li> <li><span class=\'left\'>图片宽度:</span><p>22222kb</p></li> </ul> </div> </div> </div> </div> </div> </div> <!--/.main--> </div> <script src=\"__SOURCE__/js/jquery-1.11.1.min.js\"></script> <script src=\"__SOURCE__/js/bootstrap.min.js\"></script> <script src=\"__SOURCE__/js/file.js\"></script> <script type=\"text/javascript\" src=\"__SOURCE__/js/plus/bootstrap-datetimepicker.de.js\" charset=\"UTF-8\"></script> <script src=\"__SOURCE__/js/plus/bootstrap-switch.min.js\"></script> <script src=\"__SOURCE__/js/table.js\"></script> <script type=\"text/javascript\" src=\'__SOURCE__/js/lib.js\'></script> <script> var data = new Object(); get.Id(\'files\').onchange = function () { get.filepath(this,function(str){ get.Id(\'thmb\').src = str; }); set.html(filetype,file.getName(\'files\')); get.Id(\'progress\').value = 0; set.html(get.Id(\'gress\'),\'\'); set.html(get.Tag(get.Id(\'fileSize\'), \'span\')[0], file.getSize(\'files\') + \'KB\'); set.html(get.Tag(get.Id(\'fileSize\'), \'span\')[1], \'/0kb\'); } get.Id(\'up\').onclick = function () { if(file.getSize(\'files\')<=0) { return false; } file.upload({ form:\'banner\', //form的id url:\'{:U(\'Banner/add\',0,0)}\', //上传请求文件的地址 //maxfile:true, //是否启用大文件上传 dataType:\'json\', progress:function(ev) { //--上传中的进度回掉函数 get.Id(\'progress\').value = file.getProgress(ev); //获得上传进度用file.getProgress(ev) set.html(get.Id(\'gress\'),file.getProgress(ev)+\'%\'); set.html(get.Tag(get.Id(\'fileSize\'), \'span\')[1], \'/\' + file.getProgress(ev) * (file.getSize(\'files\') / 100 >>0) + \'KB\'); }, file:\'files\', //--文件输入框的id //--上传完成后,后台返回的回调函数 success:function(e){ set.html(get.Tag(get.Id(\'fileSize\'), \'span\')[1], \'/\' + file.getSize(\'files\') + \'KB\'); set.html(get.Id(\'gress\'),\'上传完成\'); data.bannerWidth = e.bannerWidth; data.bannerHeight = e.bannerHeight; data.bannerTyle = e.bannerTyle; data.bannerImg = e.bannerImg; } }); } get.Id(\'add\').onclick = function () { data.name = get.Name(\'name\')[0].value; data.type = get.Name(\'type\')[0].value; data.link = get.Name(\'link\')[0].value; data.act = \'add\'; Call.Ajax({ type:\'post\', // 请求方式 Loading:true, // 是否启动动画 time:5, //动画显示几秒 url:\'{:U(\'Banner/add\',0,0)}?act=add\', //请求地址 data:data, //发送的数据 dataType:\'json\', //Ajax返回的数据类型 ,可以是String success:function (e) { //回调函数 set.url(e.url); } }); } </script> </body> </html>
希望本文所述对大家学习javascript程序设计有所帮助。
本文地址:https://www.stayed.cn/item/18704
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我