兼容ie9文件上传,及现代浏览器实现进度条
function fileSelect(target){ var res = filtrate(target); if(res === false){ //当文件未选中或选择不合格(return false;)时不执行下一步 return false; } $(".addFile>.file>span").html("+ Continue to add"); upladFile(); } var isIE = /msie/i.test(navigator.userAgent) && !window.opera; var dirId = ""; //文件上传,删除时的参数 var file_max_size = null; //限制总文件的大小 //文件选择 function filtrate(target,id) { var fileSize = 0; var filetypes =[".jpg",".png",".gif",".psd",".txt",".doc",".ppt",".xls",".pdf",".docx",".xlsx"]; //小写存放 var filepath = target.value; //文件路径 var maxFileSize = 10 ; //限制单个文件大小 var filemaxsize = 1024 * maxFileSize; var files = $("#file")[0].files; //获取的文件 // IE上传文件 if(window.ActiveXObject) { //var browser = navigator.appName; var b_version = navigator.appVersion; var ie_version = b_version.split(";"); var trim_Version = ie_version[1].replace(/[ ]/g,""); if(trim_Version=="MSIE9.0" || trim_Version=="MSIE10.0"){ var opt = { id: $("#file").attr("id"), frameName: "framename", url: "uploadAttachment", format: filetypes, callBack: function (data) { dirId = JSON.parse(data); dirId = dirId.dirId; } } ie_upload(opt,dirId); //IE下上传文件 return false; } } //禁止提交相同文件 if(files){ for(var i = 0; i < files.length; i++){ var file_name = files[i].name; for(var j = -1; j < $(".show_file_name").length; j++){ if(file_name==$(".show_file_name").eq(j).html()){ $.alert("The submission of the same file is not allowed");//不允许相同文件提交 return false; } } } } if(filepath && files){ var isnext = false; var fileend = filepath.substring(filepath.lastIndexOf(".")); //截取文件后缀 fileend = fileend.toLowerCase(); //文件后缀小写 var fileCount = null; maxFileCount = 10; //设置文件最多上传数量 fileCount = files.length; //实际上传文件的数量 fileCount = $(".item_file").length + 1; //实际上传文件的数量;length从零开始 if(fileCount > maxFileCount){ $.alert("File upload too many"); return false; } //判断是否符合文件上传类型 if(filetypes && filetypes.length>0){ for(var i =0; i<filetypes.length;i++){ if(filetypes[i]==fileend){ isnext = true; break; } } } if(!isnext || !fileend){ //判断是否为所需上传类型 alert("Don't accept this file type."); target.value =""; return false; } }else{ return false; } var size = fileSize / 1024;//单位:kb // 附件过大 if(file_max_size + size >filemaxsize){ $.alert("The total size of the attachment cannot be greater than"+filemaxsize/1024+"M!"); target.value =""; return false; }else{ file_max_size += size;//单位:kb } // 附件大小为0 /* if(size<=0){ $.alert("Attachment size cannot be 0 M!"); target.value =""; return false; } */ // 当前方法执行完成后执行下一步 showFileName(files); } function ie_upload(opt,dir){ /* 参数说明: opt.id : 页面里file控件的ID; opt.frameName : iframe的name值; opt.url : 文件要提交到的地址; opt.format : 文件格式,以数组的形式传递,如['jpg','png','gif','bmp']; opt.callBack : 上传成功后回调; */ var iName=opt.frameName; //太长了,变短点 var iframe,form,file,fileParent; //创建iframe和form表单 iframe = $('<iframe name="'+iName+'" id="' + iName + '" />'); form = $('<form method="post" style="display: none;" target="'+iName+'" action="'+opt.url+'" name="form_'+iName+'" enctype="multipart/form-data" />'); file = $('#'+opt.id); //通过id获取flie控件 fileParent = file.parent(); //存父级 file.appendTo(form); form.append('<input type="hidden" name="csrfToken" id="csrfToken" value="" />'); // if(opt["test"]){ form.append('<input type="hidden" name="dirId" id="dirId" value="' + dir + '" />'); // } // $("#csrfToken").appendTo(form); //插入body $("body").append(iframe).append(form); $("#csrfToken").val(getCookie("csrfToken")); //取得所选文件的扩展名 var fileFormat=/\.[a-zA-Z]+$/.exec(file.val())[0].substring(1); if(opt.format.join('-').indexOf(fileFormat)!=-1){ form.submit(); ie_showFileName(file.val()); }else{ file.appendTo(fileParent); //将file控件放回到页面 iframe.remove(); form.remove(); $.alert("Don't accept this file type."); }; //文件提交完后 iframe.load(function(){ var data = $(this).contents().find('body').html(); file.appendTo(fileParent); iframe.remove(); form.remove(); opt.callBack(data); }) } //ie文件名显示 待处理:文件大小限制 function ie_showFileName(tar){ var tar_index = tar.lastIndexOf("\\"); var tar_val = tar.substring(tar_index+1); var filename = ''; var tar_count = 10; //IE下设置文件最多上传数量 if(!tar){ return false; } //IE下文件数量限制 if($(".item_file").length >= tar_count){ $.alert("File upload too many"); return false; } //IE下禁止提交相同文件 if(tar_val){ var file_name = tar_val; for(var j = -1; j < $(".show_file_name").length; j++){ if(file_name==$(".show_file_name").eq(j).html()){ $.alert("The submission of the same file is not allowed");//不允许相同文件提交 return false; } } } filename +="<div class='item_file'>" + "<span style='margin-right:10px;' class='show_file_name'>" + tar_val + "</span>"+ "<span class='delete_file' onclick='deleteFile(this)' data-size=" + "size" + //存储文件大小 " title='delete'>delete</span>" + "</div>"; $(".showFileName").append(filename); } // 文件名显示 function showFileName(files){ var $showFileName = $(".showFileName"); var filename = ''; if(files.length){ //显示上传的文件 $.each(files,function(i,item){ filename +="<div class='item_file'>" + "<span style='margin-right:10px;' class='show_file_name'>" + item.name + "</span>"+ "(<span class='percentage'></span>)"+ "<div class='uploading'>"+ "<div class='progressBar' >"+ "<div class='progressValue' ></div>"+ "</div>" + "<span class='time'></span>"+ "</div>"+ "<span class='delete_file' onclick='deleteFile(this)' data-size=" + item.size + //存储文件大小 " title='delete'>delete</span>" + "</div>"; }) $showFileName.append(filename); }else{ $showFileName.html(" "); } } // 文件删除 function deleteFile(that) { var fileName = $(that).closest('.item_file').find("span:first").html(); $.ajax({ url:"deleteAttachment", type:"get", data:{ filename: fileName, dirId: dirId }, success :function(data){ dirId = data.dirId; file_max_size =file_max_size-$(that).attr("data-size")/1024; $(that).closest('.item_file').remove(); if(data.dirId==''){ $(".addFile>a.file>span").html("+ Add Attachment") } } }) } var xhr; var ot = 0; var oloaded = 0; //上传文件方法 function upladFile() { var fileObj = document.getElementById("file").files[0]; // js 获取文件对象 // var url = "uploadFile"; // 原生接收上传文件的后台地址 // for(var i =0; i<fileObj.length;i++){ upladFileItem(fileObj); // } } // 文件上传第一步 function upladFileItem(item){ //文件大小 var fileSize =item.size;// 文件大小 var unit = 'b';//字节单位 var unitSize = 1024;//字节转换单位 b if(fileSize/unitSize > 1){ fileSize = fileSize/unitSize; unit = 'kb'; } if(fileSize/unitSize > 1){ fileSize = fileSize/unitSize; unit = 'M'; } fileSize = fileSize.toFixed(2)+unit; //单位转换后的文件大小 $(".percentage:last").html(fileSize)//进度条百分比 var form = new FormData(); // FormData 对象 form.append("file", item); // 文件对象 form.append("dirId", dirId); // 文件对象 //原生js // xhr = new XMLHttpRequest(); // XMLHttpRequest 对象 // xhr.open("post", url, true); //post方式,url为服务器请求地址,true 该参数规定请求是否异步处理。 // xhr.onload = uploadComplete; //请求完成 // xhr.onerror = uploadFailed; //请求失败 // xhr.upload.onprogress = progressFunction;//【上传进度调用方法实现】 // xhr.upload.onloadstart = function(){//上传开始执行方法 // ot = new Date().getTime(); //设置上传开始时间 // oloaded = 0;//设置上传开始时,以上传的文件大小为0 // }; // xhr.send(form); //开始上传,发送form数据 //jq 请求与进度事件---------上传接口 $.ajax({ type: "POST", url: "uploadAttachment", data: form,//这里上传的数据使用了formData 对象 processData : false, //必须false才会自动加上正确的Content-Type contentType : false , //这里我们先拿到jQuery产生的 XMLHttpRequest对象,为其增加 progress 事件绑定,然后再返回交给ajax使用 xhr: function(){ var xhr = $.ajaxSettings.xhr(); var res = 0; xhr.upload.onprogress=progressFunction; //文件上传进度 // 以下部分待测试 // xhr.upload.onload = res = uploadComplete; //请求完成 // xhr.upload.onerror = uploadFailed; //请求失败 // if(res){ // hiddenUploading(item); // } return xhr; }, success :function(data){ dirId = data.dirId; document.querySelector("#file").outerHTML = document.querySelector("#file").outerHTML //清空#file选中的文件 } }); } //上传完成后隐藏进度条 function hiddenUploading(item){ var name = item; var $showName = $(".showFileName").find(".item_file:last span:first"); //查找页面显示最近添加的文件 if(name = $showName.html()){ $showName.closest(".item_file").find(".uploading").hide(); } } //上传进度实现方法,上传过程中会频繁调用该方法 function progressFunction(evt) { var $progressBar = $(".progressBar:last"); var $progressValue = $(".progressValue:last"); // event.total是需要传输的总字节,event.loaded是已经传输的字节。如果event.lengthComputable不为真,则event.total等于0 if (evt.lengthComputable) { var num = Math.round(evt.loaded / evt.total * 100); //转换百分比 if(num == 100){ hiddenUploading($progressBar); } num += "%"; $progressValue.css('width', num) //页面显示进度条 } var time = $(".time:last"); var nt = new Date().getTime();//获取当前时间 var pertime = (nt-ot); //计算出上次调用该方法时到现在的时间差,单位为s ot = new Date().getTime(); //重新赋值时间,用于下次计算 var perload = evt.loaded - oloaded; //计算该分段上传的文件大小,单位b oloaded = evt.loaded;//重新赋值已上传文件大小,用以下次计算 //上传速度计算 var speed = perload/pertime;//速度大小(初始单位: b/s) var bspeed = speed; var units = 'b/s';//单位名称 if(speed/1024>1){ speed = speed/1024; units = 'k/s'; } if(speed/1024>1){ speed = speed/1024; units = 'M/s'; } speed = speed.toFixed(1); //剩余时间 var resttime = ((evt.total-evt.loaded)/bspeed).toFixed(1); // speed //速度 // units // 速度单位 // resttime //剩余时间 $(".time:last").html(speed + units +' '+ resttime +'s'); //显示速度,时间 if(bspeed==0) $("#time:last").html( 'Upload Canceled' ); } //上传成功响应 function uploadComplete(evt) { //服务断接收完文件返回的结果 // alert(evt.target.responseText); console.log(evt); } //上传失败 function uploadFailed(evt) { console.log("Upload Fail!"); } //取消上传 function cancleUploadFile(){ xhr.abort(); console.log("Upload Canceled"); }