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