//********************** Check 区/**+-----------------------------------------------
函 数 名: Check_File
功能描述: 检查文件的合法性
函数说明: 直接调用
调用函数: Check_File()
参数:
设 计 者: ggg     日期: 2004-9-1 7:06
修 改 者: ggg     日期: 2004-9-1 7:06
版    本: 1.0
**+-----------------------------------------------
*/function Check_File()
{
$file_tmp_name=$this->Get_FileTmpName(); //得到临时文件名
$file_name=$this->Get_FileName(); //得到文件名
$file_size=$this->Get_FileSize(); //得到文件大小
$file_up_size=$this->Get_FileUpSize(); //得到文件大小
//检查上传的文件是否存在
if(empty($file_tmp_name) || $file_tmp_name=="none" || !file_exists($file_tmp_name))//没选择要上传的文件,返回
{
$this->mStrErr="上传的文件不存在!";
$this->Show_Debug();
return false;
}
if(!is_writeable($this->Get_FileUpPath())) //如果上传至的目录可写
{
$this->mStrErr="上传文件目录:".$this->Get_FileUpPath()." 不可写,请先更改目录属性!";
$this->Show_Debug();
return false;
} //验证上传文件的文件名的合法性
if($file_size>$file_up_size) //换成小写
{
$this->mStrErr="上传文件允许的最大尺寸为".$file_up_size."字节!!";
$this->Show_Debug();
return false;
} //验证上传文件的文件名的合法性
if($this->mIsFileLower) //换成小写
$file_name=$this->MyStrTolower($file_name); //得到文件名与扩展名
$file_name_name=trim($this->Get_Str_Head($file_name,'.'));
$file_name_ext="";//trim($this->Get_Str_End($file_name,'.'));
if($this->mIsFileRight) //如果要保证文件名只能由字母,数字,上下划线,点号组成
{
if(!ereg("^[0-9a-z\._\-]+$",$file_name_ext))//看扩展名的合法性
{
$this->mStrErr="上传的扩展名:".$file_name_ext." 不符合标准,已去除扩展名";
$file_name_ext=""; //这里的处理是直接删除扩展名
}

if(!ereg("^[0-9a-z\._\-]+$",$file_name_name)) //看文件名的合法性
{
srand((double)microtime()*1000000);
$this->mStrErr="上传的文件名:".$file_name_name." 不符合标准";
$file_name_name=rand(1,999).$this->mErrorFile;
$this->mStrErr.=",已改成:".$file_name_name."!";
}
$file_name=$file_name_name.$file_name_ext; //重新得到新的文件名
} //文件名过长处理
if(strlen($file_name)>$this->mMaxFileNameLen) //文件名过长
{
if(strlen($file_name_ext)>$this->mMaxFileNameLen) //如果扩展名大于所允许的最长字符 可能性很小
{
$this->mStrErr.="扩展名长度大于:".$this->mMaxFileNameLen." !";
$file_name_ext=substr($file_name_name,0,5);
}
if(strlen($file_name_name)>$this->mMaxFileNameLen) //如果文件名大于所允许的最长字符,也进行截取
{ //文件名的长度是根据 总长度 减 扩展名长度得到
$this->mStrErr.="文件名长度大于:".$this->mMaxFileNameLen." !";
$file_name_name=substr($file_name_name,0,$this->mMaxFileNameLen-strlen($file_name_ext));
}
} //对扩展名进行过滤检查
while(list($k, $v) = each($this->ExtFilter))
{
if(strstr($file_name_ext,$k)) //扩展名包含了关键字了
{
$this->mStrErr.="扩展名包含了关键字了:".$v." !";
$file_name_ext=str_replace($v,$k,$file_name_ext);
}
}
$file_name=$file_name_name.$file_name_ext;//[如果加了这个变量“$file_name_ext”,则上传后的文件将会多出一个扩展名] //重新得到新的文件名 //看将要上传的文件是不是已存在了,修改文件名
if(file_exists($this->Get_FileUpPath().$file_name))
{
$this->mStrErr.="要上传的文件名已存在:".$this->Get_FileUpPath().$file_name." !";
$file_name_name=substr($file_name_name,0,$this->mMaxFileNameLen);//为防止连续重复后文件名变得过长,在此截除
$count_i=0;
while(file_exists($this->Get_FileUpPath().$file_name_name.$count_i.$file_name_ext))$count_i++;//a1 a2 a3
$file_name=$file_name_name.$count_i.$file_name_ext; //重新得到新的文件名
} //此时已得到最终的文件名
$this->Set_FileName($file_name); //重新设置类成员变量的文件名称

//验证文件类型是否正确
if(false==$this->Check_FileUpType())
{
return false;
}
$this->Show_Debug();
return !false;
}//END Check_File

解决方案 »

  1.   

    /**+-----------------------------------------------
    函 数 名: Check_FileUpType
    功能描述: 检查文件上传所允许的类型
    函数说明: 直接调用
    调用函数: Check_FileUpType()
    参数:
    返    回: 返回 true 或 false ,表示验证是否成功
    设 计 者: ggg     日期: 2004-9-1 7:04
    修 改 者: ggg     日期: 2004-9-1 7:04
    版    本: 1.0
    **+-----------------------------------------------
    */ function Check_FileUpType()
    {
    $file_up_type=$this->Get_FileUpType();
    if(empty($file_up_type)) //如果文件类型没指定就表示允许所有的类型
    {
    return !false;
    } $file_type=$this->Get_FileType();
    $array_filetype= explode(",", $file_up_type); //判断传过来的文件类型是否符合 以,分隔 
    for($count_i=0;$count_i<count($array_filetype);$count_i++)
    {
    $cnt_filetype=trim($array_filetype[$count_i]); //得到这次循环的文件类型
    //$cnt_filetype_len=strlen($cnt_filetype);
    if(strstr($file_type,$cnt_filetype)) //只要一个类型符合就通过
          //if(substr($file_type, -$cnt_filetype_len)==$cnt_filetype) 只要一个类型符合就通过
    {
    break;
    }
    }
    if($count_i==count($array_filetype)) //表示一项类型都不符合
    {
    $this->mStrErr="请确认上传的类型为".$file_up_type."!";
    $this->Show_Debug();
    return false;
    }
    return !false;
    }// END Check_FileUpType/**+-----------------------------------------------
    函 数 名: UpLoad
    功能描述: 上传文件
    函数说明: 类的构造函数 用于初始化类的成员变量
    可以采用 GggFileUpload("aaa.gif","aaa.gif");来更新文件的功能  来达到先删除服务器上 aaa.gif 再次上传的文件改成 aaa.gif 功能
    如果不指定 originalFile 可运用于第一次添加文件的状态
    调用函数: GggFileUpload($keepName,$originalFile)
    参数:
    $keepName
    指定其参数表示上传文件后以keepName命名文件名,但如果该文件已存在或文件名检查不通过程序会在对该文件名进行修改
    $originalFile
    原来的文件名,设置该项用于更新.程序会在文件上传前先删除originalFile 
    返    回: 上传失败返回空 否则返回上传成功后的文件名
    设 计 者: ggg     日期: 2004-9-1 5:55
    修 改 者: ggg     日期: 2004-9-1 5:55
    版    本: 1.0
    **+-----------------------------------------------
    */
        function ReRes()//真值处理函数
    {
     $this->$uploadRes = true; 
     return $this->$uploadRes;
    } function UpLoad($keepName="",$originalFile="")
    {
    if(!empty($keepName))
    {
    $this->Set_FileName($keepName); //改变上传的文件名
    $this->mStrErr="改变上传的文件名: ".$this->Get_FileName()."";
    $this->Show_Debug();
    }
    if(!empty($originalFile) && file_exists($this->Get_FileUpPath().$originalFile))
    {
    @unlink($this->Get_FileUpPath().$originalFile);//先删除originalFile文件
    $this->mStrErr="删除了: ".$this->Get_FileUpPath().$originalFile." 文件";
    $this->Show_Debug();
    }
    $this->mStrErr="";
    /*
    $this->Set_File($inputName);
    $this->Set_FileUpPath($fileUpPath);
    $this->Set_FileUpSize($fileUpSize);
    $this->Set_FileUpType($fileUpType);
    print($this->mInputName."<br>");
    print($this->mFileUpType."<br>");
    print($this->mFileUpSize."<br>");
    print($this->mFileUpPath."<br>"); print($this->mFileType."<br>");
    print($this->mFileSize."<br>");
    print($this->mFileName."<br>");
    print($this->mFileTmpName."<br>");
    */ if($this->Check_File()){
      if (@copy($this->Get_FileTmpName(),$this->Get_FileUpPath().$this->Get_FileName())){
        $this->ReRes();
      }
    } else {
      return "文件检验失败!"; 
    }
    /* 即使复制成功也返回失败。不知道是什么原因
    if(copy($this->Get_FileTmpName(),$this->Get_FileUpPath().$this->Get_FileName())==false);   //上传文件
    {
    $this->mStrErr="复制档案: ".$this->Get_FileUpPath().$this->Get_FileName()." 失败";
    $this->Show_Debug();
    return "";
    }*/ @unlink($this->Get_FileTmpName());//删除临时文件
    return $this->Get_FileName();
    }
    /*   得到以某字符间隔的字符头,尾部     */
    function Get_Str_Head($varName,$separator='.') //返回文件的名字
    {
    // print($varName);
    // die();
    $file_len=0;
    if(!($file_len=strrpos($varName, $separator))) //如果文件没有扩展名,文件名即为全文件
    {
    $file_len=strlen($varName);
    }
    $file_name=substr($varName,0,$file_len); //得到上传文件名字
    return(substr($varName,0,$file_len));
     }//Get_Str_Head() function Get_Str_End($varName,$separator='.') //返回文件的扩展名
    {
    $file_len=0;
    $file_ext="";
    if($file_len=strrpos($varName, $separator)) //如果文件没有扩展名,文件名即为全文件,扩展名空
    {
    $file_ext=substr($varName,-(strlen($varName)-$file_len)); //得到上传文件的扩展名
    }
    return($file_ext);
    }//Get_Str_End()// 自定义将字串里的小写全部转成大写,但不破坏中文字
    function  MyStrTolower($varName)
    {
    return preg_replace('/[A-Z]+/e',"strtolower('\\0')",$varName);  
    } }// END class GggFileUpload