随笔 - 87  文章 - 279  trackbacks - 0
<2007年3月>
25262728123
45678910
11121314151617
18192021222324
25262728293031
1234567

潜心看书研究!

常用链接

留言簿(19)

随笔分类(81)

文章分类(89)

相册

ACM OJ

My friends

搜索

  •  

积分与排名

  • 积分 - 215485
  • 排名 - 116

最新评论

阅读排行榜

评论排行榜

今天做面试题,有一个文件上传的,发觉以前做项目为了赶时间都是直接用别人的上传类,交笔试题,怎么也不能用别人的吧,所以就写了一个,可能很多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 < 0return $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 < 0echo $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>
posted on 2008-04-12 11:47 阅读(1511) 评论(0)  编辑 收藏 引用 所属分类: PHP之路

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理