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> ' ;
}
?>
/* *
* 文件上传类
* 成员变量带*号必须要初始化
* @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 >
< 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 >