javascrip客户端验证文件大小及文件类型并重置上传

    技术2022-07-04  140

    为了提高效率,很多时候需要在web页面中对客户端上传的文件进行验证,然后再上传到服务器。下面是我写的一个通用的javascrip脚本,虽然调用时需要赋的参数比较多,但都是实际需要中真正需要使用到的。各位可以参考,并改成自己需要的脚本。

    代码 /*****获取文件信息 edit by zhaogw 参考by misssionOtherAttEdit.jsp*****/ /* file:input type="file"的对象,一般用this。vType:一个对象名,用于记录文件的文件类型信息。一般为input对象。DivType:一个Div对象的名称。把其innerHTML内容用于显示文件的类型信息。vFile:一个对象名,用于记录文件的文件名信息。一般为input对象。DivFile:一个Div对象的名称。把其innerHTML内容用于显示文件的文件名信息。vSize,DivSize同上面类似,只是记录文件的大小信息。mMaxSize:以m为单位计算其允许上传的最大文件大小。allowType:只接受的文件类型 */ function  getFileInfo(file,mMaxSize,allowType,vFile,DivFile,vType,DivType,vSize,DivSize){    var filePath = file.value;//文件路径     var fileName;//文件名     var fileType;//文件类型     var tmpObj;//临时对象     var notAllowType=new Array("exe","bat","asp","jsp","js","dll" );        var mHTML=document.getElementById(file.name+'Td' ).innerHTML;    /*     var mHTML="<input type='file' name='"+                file.name+"' class='input100' id='"+file.id+                "' Tip='无法上传空文件'  contentEditable='false' tmt:required='true' focusTips='请输入文件名' onChange='getFileInfo(this,"+                mMaxSize+",/""+allowType+"/",/""+vFile+"/",/""+DivFile+"/",/""+vType+"/",/""+DivType+"/",/""+vSize+"/",/""+DivSize+"/")'>";                 */ //    alert(mHTML);     //get file name     if(filePath != null && filePath != '' ){        var pass=true ;        //文件类型         fileType = filePath.substring(filePath.lastIndexOf('.'+ 1 ,filePath.length);        if (fileType!=null&&fileType!='' )        {            for (var i in  notAllowType){            if (fileType.toLowerCase()== notAllowType[i]){                pass=false ;                break ;}            }        }        //允许的类型,空的话就不设置允许类型         var match=false ;        if (allowType!=null&&allowType!='' ){            var allowList=allowType.split('|' );            for (var j in  allowList){            if (fileType.toLowerCase()== allowList[j].toLowerCase()){                match=true ;                break ;}            }        } else {match=true ;}                if (pass&& match)        {        fileName = filePath.substring(filePath.lastIndexOf('//'+ 1 ,filePath.length);                tmpObj= document.getElementById(vType);        if (tmpObj!=null )            tmpObj.value =  fileType;                    tmpObj= document.getElementById(DivType);        if (tmpObj!=null )        tmpObj.innerHTML =  fileType;                tmpObj= document.getElementById(vFile);        if (tmpObj!=null )        tmpObj.value =  fileName;                tmpObj= document.getElementById(DivFile);        if (tmpObj!=null )        tmpObj.innerHTML =  fileName;            try {        var  fso,f,s;        fso = new ActiveXObject("Scripting.FileSystemObject" );        f =  fso.GetFile(file.value);        if(f.Size > mMaxSize*1048576 ){            alert("文件大小不能超过"+mMaxSize+"M" );            document.getElementById(file.name+'Td').innerHTML =  mHTML;                            tmpObj= document.getElementById(vType);        if (tmpObj!=null )            tmpObj.value = '' ;                    tmpObj= document.getElementById(DivType);        if (tmpObj!=null )        tmpObj.innerHTML = '' ;                tmpObj= document.getElementById(vFile);        if (tmpObj!=null )        tmpObj.value = '' ;                tmpObj= document.getElementById(DivFile);        if (tmpObj!=null )        tmpObj.innerHTML = '' ;                tmpObj= document.getElementById(vSize);        if (tmpObj!=null )        tmpObj.value = '' ;                tmpObj= document.getElementById(DivSize);        if (tmpObj!=null )        tmpObj.innerHTML = '' ;            return ;        }        else         {        tmpObj = document.getElementById(vSize);        if (tmpObj!=null )        tmpObj.value =  f.Size;                tmpObj= document.getElementById(DivSize);        if (tmpObj!=null )        tmpObj.innerHTML = f.Size+"  byte(字节)" ;                var imgType=new Array("jpg","jpeg","gif","bmp" );        var isImg=false ;        //文件类型         if (fileType!=null&&fileType!='' )        {            for (var k in  imgType){            if (fileType.toLowerCase()== imgType[k]){                isImg=true ;                break ;}            }        }        var tmpObj=document.getElementById("imgView" );        if (isImg&& tmpObj){            var y = document.getElementById(file.name+"img" );             if (y){                y.src = "file://localhost/" +  file.value;             }else {                 var img=document.createElement("img" );                img.setAttribute("src","file://localhost/"+ file.value);                 img.setAttribute("width","120" );                 img.setAttribute("height","90" );                 img.setAttribute("id",file.name+"img" );                 tmpObj.appendChild(img);                 }        }}    }catch (e){        //ignore     }    }    else if (!pass) {alert("不允许上传文件类型为:"+fileType);document.getElementById(file.name+'Td').innerHTML =  mHTML;}    else if (!match) {alert("只允许上传文件类型为:"+allowType);document.getElementById(file.name+'Td').innerHTML =  mHTML;}    }}

     

    调用方法的代码:

     

    代码 <td width="23%" class="inputTd" id="fileNameTd" colspan="3">      <input type="file" name="fileName" class="input100" id="fileName" Tip="无法上传空文件"  Usage="notempty" contentEditable="false" tmt:required="true" focusTips="请输入文件名" onChange="getFileInfo(this,10,'','vo.fileName','fileNameTd2','vo.fileType','fileTypeDiv','vo.fileSize','fileSizeDiv')">      <input type="hidden" name="vo.fileName" id="vo.fileName">      <span id="fileNameDiv" name="fileNameDiv"></span> </td>

     

     

    需要显示当前上传图片的需要加入以下代码:

    <div id="imgView"> </div>

    简单说明下脚本的相关约定:

    1:如必须使用<td>对象来(或者别的有innerHTML属性的对象来包含着input的type="file"的对象,并且名称必须是input的name属性+"Td"为后缀)

    2:imgView写死了,由于不想再加入更多的参数,因此,这里就固定这个了。大家也可以把名称作参数传递进去。看各位的方便了。

    3:所有参数都可以为''但第一个参数基本上是this。脚本会自动去判断相关的参数的。

     


    最新回复(0)