zoukankan      html  css  js  c++  java
  • 兼容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  +'&nbsp;&nbsp;&nbsp;&nbsp;'+  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");
    }
  • 相关阅读:
    [BZOJ 4710] 分特产
    洛谷 P4827 [国家集训队] Crash 的文明世界
    Test 7.12 T2
    [洛谷 P1377] TJOI2011 树的序
    [洛谷 P1013] NOIP1998 提高组 进制位
    ajax2
    Ajax
    javascript下兼容都有哪些
    获取类名 封装 getStyle
    作用域
  • 原文地址:https://www.cnblogs.com/zhou195/p/7484563.html
Copyright © 2011-2022 走看看