php文件上传类v1.0

php文件上传类v1.0

今天做面试题,有一个文件上传的,发觉以前做项目为了赶时间都是直接用别人的上传类,交笔试题,怎么也不能用别人的吧,所以就写了一个,可能很多bug,没实际项目测试过,呵呵

<? php

/* *
 * 文件上传类
 * 成员变量带*号必须要初始化
 * @version 1.0
 * @author howeey
 
*/
class  FileUpload {
    
    
var   $filePath // * 文件目的路径
    
    
var   $fileField // * 默认$_FILES[$fileField],通过$_FILES环境变量获取上传文件信息
    
    
var   $originName // 源文件名
    
    
var   $tmpFileName // 临时文件名
    
    
var   $fileType // 文件类型(文件后缀)
    
    
var   $fileSize // 文件大小
    
    
var   $newFileName // 新文件名
    
    
var   $allowType   =   array ( ' txt ' , ' jpg ' , ' doc ' );  // 允许上传的文件类型
    
    
var   $maxSize   =   2048 // 允许文件上次的最大长度

    
var   $isUserDefName   =   false // 是否采用用户自定义名
    
    
var   $userDefName // 用户定义名称
    
    
var   $isRandName   =   true // 是否随机重命名
    
    
var   $randName // 系统随机名称
    
    
var   $errorNum   =   0 // 错误号
    
    
var   $isCoverModer   =   true // 是否覆盖模式
    
    
var   $debug   =   false // 是否debug
    
    
function  FileUpload( $options   =   array ()) {
        
// 设置构造属性列表
         $this -> setOptions( $options );
    }
    
    
function  uploadFile( $filefield ,   $options   =   array ()) {
        
// 设置错误位
         $this -> setOption( ' errorNum ' , 0 );
        
// 设置fileField
         $this -> setOption( ' fileField ' ,   $filefield );
        
// 设置上传时属性列表
         $this -> setOptions( $options );
        
// 设置文件信息
         $this -> setFiles();
        
// 判断合法性
         $this -> checkValid();
        
// 检查文件路径
         $this -> checkFilePath();
        
// 设置新文件名
         $this -> setNewFileName();
        
// 检查是否出错
         if  ( $this -> errorNum  <   0 return   $this -> errorNum;
        
// 上传文件
         return   $this -> copyFile();
    }
    
    
/* *
     * 设置成员变量列表
     *
     * @param unknown_type $options
     
*/
    
function  setOptions( $options   =   array ()) {
        
foreach  ( $options   as   $key   =>   $val ) {
            
if  ( ! in_array ( $key ,   array ( ' filePath ' , ' fileField ' , ' originName ' , ' allowType ' , ' maxSize ' , ' isUserDefName ' , ' userDefName ' , ' isRandName ' , ' randName ' )))  continue ;
            
$this -> setOption( $key ,   $val );
        }
    }
    
    
/* *
     * 设置文件信息
     *
     
*/
    
function  setFiles() {
        
if  ( $this -> getFileErrorFromFILES()  !=   0 ) {
            
$this -> setOptions( ' errorNum ' ,   - 1 );
            
return  ;
        }
        
$this -> setOption( ' originName ' ,   $this -> getFileNameFromFILES());
        
$this -> setOption( ' tmpFileName ' ,   $this -> getTmpFileNameFromFILES());
        
$this -> setOption( ' fileType ' ,   $this -> getFileTypeFromFILES());
        
$this -> setOption( ' fileSize ' ,   $this -> getFileSizeFromFILES());
    }
    
    
/* *
     * 设置某个成员变量
     *
     * @param unknown_type $key
     * @param unknown_type $val
     
*/
    
function  setOption( $key ,   $val ) {
        
$this -> $key   =   $val ;
        
if  ( $this -> debug) {
            
echo   ' 成员变量  ' . $key . '  被设置成  ' . $val . ' <br> ' ;
        }
    }
    
    
/* *
     * 设置新的文件名(根据isRandName,isUserDefName标志分3种新文件名,随机文件名,用户自定义文件名,源文件名)
     *
     
*/
    
function  setNewFileName() {
        
if  ( $this -> isRandName  ==   false   &&   $this -> isUserDefName  ==   false ) {
            
// 新文件名和原来文件名相同
             $this -> setOption( ' newFileName ' ,   $this -> originName);
        } 
else   if  ( $this -> isRandName  ==   true   &&   $this -> isUserDefName  ==   false ) {
            
// 产生随机文件名
             $this -> setOption( ' newFileName ' ,   $this -> proRandName() . ' . ' . $this -> fileType );
        } 
else   if  ( $this -> isRandName  ==   false   &&   $this -> isUserDefName  ==   true ) {
            
// 产生用户自定义用户名
             $this -> setOption( ' newFileName ' ,   $this -> userDefName);
        } 
else  {
            
$this -> setOption( ' errorNum ' ,   - 4 );
        }
    }
    
    
/* *
     * 判断上传文件的合法性
     *
     
*/
    
function  checkValid() {
        
// 判断文件大小
         $this -> checkFileSize();
        
// 判断文件类型
         $this -> checkFileType();
    }
    
    
/* *
     * 检查文件类型
     *
     
*/
    
function  checkFileType() {
        
if  ( ! in_array ( $this -> fileType ,   $this -> allowType))  $this -> setOption( ' errorNum ' ,   - 2 );
        
return   $this -> errorNum;
    }
    
    
/* *
     * 判断文件大小
     *
     
*/
    
function  checkFileSize() {
        
if  ( $this -> fileSize   >   $this -> maxSize)  $this -> setOption( ' errorNum ' ,   - 3 );
        
return   $this -> errorNum;
    }
    
    
/* *
     * 判断文件路径
     *
     
*/
    
function  checkFilePath() {
        
if  ( ! file_exists ( $this -> filePath)) {
            
if  ( $this -> isCoverModer) {
                
// 如果是覆盖模式,建立路径
                 $this -> makePath();
            } 
else  {
                
$this -> setOption( ' errorNum ' ,   - 6 );
            }
        }
    }
    
    
/* *
     * 产生随机文件名
     *
     
*/
    
function  proRandName() {
        
$tmpStr   =   " abcdefghijklmnopqrstuvwxyz0123456789 " ;
        
srand (( double ) microtime () * 1000000 );
        
$str   =   "" ;
        
for  ( $i = 0 $i < 8 $i ++ ) {
            
$num   =   rand ( 0 ,   strlen ( $tmpStr ));
            
$str   .=   $tmpStr [ $num ];
        }    
        
return   $str ;
    }
    
    
/* *
     * 建立文件路径
     *
     
*/
    
function  makePath() {
        
if  ( ! @ mkdir ( $this -> filePath ,   0755 )) {
            
$this -> setOption( ' errorNum ' ,   - 7 );
        }
    }
    
    
/* *
     * 拷贝文件到指定目录
     *
     * @return unknown
     
*/
    
function  copyFile() {
        
$filePath   =   $this -> filePath;
        
if  ( $filePath [ strlen ( $filePath ) - 1 !=   ' / ' ) {
            
$filePath   .=   ' / '
        }
        
$filePath   .=   $this -> newFileName;
        
if  ( ! @ move_uploaded_file ( $this -> tmpFileName ,   $filePath )) {
            
$this -> setOption( ' errorNum ' ,   - 5 );
        }
        
return   $this -> errorNum;
    }
    
    
/* *
     * 从环境变量$_FILES获取文件错误
     *
     
*/
    
function  getFileErrorFromFILES() {
        
return   $_FILES [ $this -> fileField][ ' error ' ];
    }
    
    
/* *
     * 从环境变量$_FILES获取文件类型
     *
     
*/
    
function  getFileTypeFromFILES() {
        
$str   =   $_FILES [ $this -> fileField][ ' name ' ];
        
$aryStr   =   split ( " \. " ,   $str );
        
$ret   =   strtolower ( $aryStr [ count ( $aryStr ) - 1 ]);
        
return   $ret ;
    }
    
    
/* *
     * 从环境变量$_FILES获取文件名
     *
     
*/
    
function  getFileNameFromFILES() {
        
return   $_FILES [ $this -> fileField][ ' name ' ];
    }
    
    
/* *
     * 从环境变量$_FILES获取临时变量名
     *
     
*/
    
function  getTmpFileNameFromFILES() {
        
return   $_FILES [ $this -> fileField][ ' tmp_name ' ];
    }
    
    
/* *
     * 从环境变量$_FILES获取文件大小
     *
     
*/
    
function  getFileSizeFromFILES() {
        
return   $_FILES [ $this -> fileField][ ' size ' ];
    }
    
    
function  getErrorMsg() {
        
$str   =   " 上传文件出错 :  " ;
        
switch  ( $this -> errorNum) {
            
case   - 1 :
                
$str   .=   " 未知错误 " ;
                
break ;
            
case   - 2 :
                
$str   .=   " 未允许类型 " ;
                
break ;
            
case   - 3 :
                
$str   .=   " 文件过大 " ;
                
break ;
            
case   - 4 :
                
$str   .=   " 产生文件名出错 " ;
                
break ;
            
case   - 5 :
                
$str   .=   " 上传失败 " ;
                
break ;
            
case   - 6 :
                
$str   .=   " 目录不存在 " ;
                
break ;
            
case   - 7 :
                
$str   .=   " 建立目录失败 " ;
                
break ;
        }
        
return   $str ;
    }
    
    
/* *
     * 设置是否debug
     *
     * @param unknown_type $debug
     
*/
    
function  setDebug( $debug ) {
        
$this -> debug  =   $debug ;
    }
}

?>

<?  
echo   ' <br> ' ;
$tmp   =   new  FileUpload( array ( ' filePath ' => ' ./default ' ));
foreach  ( $_FILES   as   $key   =>   $val ) {
    
$res   =   $tmp -> uploadFile( $key );
    
if  ( $res   <   0 echo   $tmp -> getErrorMsg() . ' <br> ' ;
    
else   echo   ' 文件上传成功<br> ' ;
}
?>

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html  xmlns ="http://www.w3.org/1999/xhtml" >
< head >
< meta  http-equiv ="Content-Type"  content ="text/html; charset=gb2312"   />
< title > 多文件上传demo </ title >
</ head >

< script  language ="javascript" >

var trIndex = 0;
var tmpIndex = 0;

function addItem() {
    trIndex
++;
    tmpIndex
++;
    
var containerObj = document.getElementById("container0");
    
var tr = containerObj.insertRow(trIndex);
    
var td = tr.insertCell(0);
    str 
= "userfile" + String(trIndex);
    alert(str);
    td.innerHTML 
= "<input id=\""+str+"\"name=\""+str+"\" type=\"file\"" + " <input name=\"del\" type=\"button\" value=\"删除\" onclick=\"delItem("+String(trIndex)+");\"";    
}


function delItem(trnum) {
    
var containerObj = document.getElementById("container0");
    
var tr = containerObj.deleteRow(trIndex);
    trIndex
--;
}


</ script >

< body >

< form  id ="form0"  enctype ="multipart/form-data"  action ="FileUpload.php"  method ="POST" >  
< table  id ="container0"  width ="100%"  border ="0"  cellspacing ="5"  cellpadding ="0" >
  
< tr  >
    
< td  >     < p >
      
< input  id ="fu0"  type ="hidden"  name ="MAX_FILE_SIZE"  value ="300000000"   />  
      
< input  name ="userfile"  type ="file"   />  
      
</ p >
      
</ td >
  
</ tr >
  
< tr  >
    
< td  >    
    
    
< p >
      
< input  name ="add"  type ="button"  value ="添加"  onclick ="addItem();"   />  
      
< input  type ="submit"  value ="上传"   />  
        
</ p >
        
</ td >
        
</ tr >
</ table >

 
</ form >  

</ body >
</ html >

你可能感兴趣的:(php文件上传类v1.0)