封装一个文件上传类完成基本功能如下:
1.可上传多个或单个文件
2.上传成功返回一个或多个文件名
3.上传失败则返回每个失败文件的错误信息
上传类中的基本功能:
1.构造参数,用户可以自定义配置参数,不限大小写,不限个数,不限顺序
2.检测:保存路径、文件类型、文件大小、文件名是否为随机文件名等
3.错误消息:如果在判断过程中出现错误,则生成错误号并返回错误消息
上传类如下:
Code<?php
/**
* 通用文件上传类
*/
class FileUpload
{
private $filepath; //指定上传文件保存的路径
private $allowtype=array('gif','jpg','png','jpeg');//默认允许上传文件的类型
private $maxsize=5000; //默认允许上传文件的最大长度
private $israndname=true; //是否使用随机文件名,false则使用原文件名 private $originName; //原文件名
private $tmpFileName; //临时文件名
private $fileType; //文件类型
private $fileSize; //文件大小
private $newFileName; //新文件名
private $errorNum=0; //错误号
private $errorMsg=''; //错误消息 //初始化文件上传
//1.指定上传路径 2.限制类型 3.限制大小 4.是否使用随机文件名
//使用可变数组来实现构造函数的重载【重载】
//优点:
//用户可以自定义参数的个数和顺序
//用户在输入关联键值错误的情况下仍然可以使用默认参数,不影响代码执行
//不区分键名的大小写
function __construct($options=array()){
//如果使用$this->filepath=$filepath的常规构造函数初始化:参数个数顺序用户无法自定义,用户输入错误时代码无法执行
//根据类的对象获取类的属性的数组:get_class_vars(get_class($this)); //判断用户给定的数组中的key是存在于类的属性中,如果存在,则给属性重新赋值
foreach ($options as $key => $val) {
$key = strtolower($key);//将用户给定的key转为小写 比较
if (!array_key_exists($key, get_class_vars(get_class($this)))) {
continue;
}
$this->SetOptions($key,$val);
}
} //上传文件
public function UploadFile($fileField){
//检查用户设置的上传文件的保存路径
if(!$this->CheckFilePath()){
$this->errorMsg=$this->SetErrorMsg();
return false;
} //取得上传文件的信息
$name = $_FILES[$fileField]['name'];
$tmp_name = $_FILES[$fileField]['tmp_name'];
$size = $_FILES[$fileField]['size'];
$error = $_FILES[$fileField]['error']; //判断 是否为多文件上传
//一个文件上传出错,则全部失败,全部正确则全部上传
$result=true;//申明变量$result用于判断上传过程中是否有错 //如果是多文件上传
if(is_array($name)){ //定义错误信息数组,存储出错信息
$errors = array(); //循环读取文件信息并保存文件
for ($i=0; $i < count($name); $i++) {
//循环遍历文件信息,判断类型和大小
if ($this->SetFileInfo($name[$i],$tmp_name[$i],$size[$i],$error[$i])) {
//检查文件大小和类型
if(!$this->CheckFileType()||!$this->CheckFileSize()){
//将出错信息储存到数组$errors中
$errors[]=$this->SetErrorMsg();
$result = false;
}
} else {
$errors[]=$this->SetErrorMsg();
$result = false;
} //将文件属性初始化,以免出错的文件信息被保留
if(!$result){
$this->SetFileInfo();
}
} //如果检查上传的所有文件都没有问题了,则保存所有文件
if ($result) { //定义一个数组变量$fileNames,用于存储上传成功后的图片文件名
$fileNames = array(); //循环文件信息,保存文件
for ($i=0; $i < count($name); $i++) {
if ($this->SetFileInfo($name[$i],$tmp_name[$i],$size[$i],$error[$i])) {
$this->SetFileName();
if (!$this->CopyFile()) {
$errors=$this->SetErrorMsg();
$result=false;
} else {
$fileNames[]=$this->newFileName;
}
}
} //将新文件名数组赋值给类的属性newFileName
$this->newFileName=$fileNames;
} $this->errorMsg = $errors;
return $result; }else{//如果是单个文件上传
if($this->SetFileInfo($name,$tmp_name,$size,$error)){
//检查文件大小和类型
if($this->CheckFileType()&&$this->CheckFileSize()){
//获取文件名
$this->SetFileName();
//保存文件
if($this->CopyFile())
{
return true;
}else{
$result=false;
}
}
else{
$result=false;
}
}else{
$result=false;
}
if(!$result){
$this->errorMsg= SetErrorMsg();
}
return $result; }
} //获取文件名
public function GetNewFileName(){
return $this->newFileName;
} //获取错误信息
public function GetError(){
return $this->errorMsg;
} //初始化文件信息
private function SetFileInfo($name='',$tmp_name='',$size=0,$error=0)
{
$this->SetOptions('errorNum',$error);
if($error){
return false;
}
$this->SetOptions('originName',$name);
$this->SetOptions('tmpFileName',$tmp_name);
$this->SetOptions('fileSize',$size); $arrStr = explode('.', $name);
$this->SetOptions('fileType',strtolower($arrStr[count($arrStr)-1])); return true;
} //获取上传后的文件名
private function SetFileName()
{
if($this->israndname){
$fileName =@date('YmdHis').rand(100,999);
$fileName = $fileName.'.'.$this->fileType;
$this->SetOptions("newFileName",$fileName);
}else{
$this->SetOptions('newFileName',$this->originName);
}
} //上传失败时,获取失败消息
private function SetErrorMsg()
{
$msg='上传文件<font color="red">'.$this->originName.'</font>时出错:';
switch ($this->errorNum) {
case 4:$msg.="没有文件被上传";break;
case 3:$msg.="文件只有部分被上传";break;
case 2:$msg.="文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值";break;
case 1:$msg.="文件超过了 php.ini 中 upload_max_filesize 选项限制的值";break;
case -1:$msg.="未允许的文件类型";break;
case -2:$msg.="文件过大,上传文件不能超过{$this->maxSize}个字节";break;
case -3:$msg.="上传失败";break;
case -4:$msg.="建立存放文件目录失败,请重新指定上传目录";break;
case -5:$msg.="必须指定上传文件的路径";break;
default:$msg.="未知错误";
}
return $msg.'<br>';
} //设置属性
private function SetOptions($key,$val){
$this->$key=$val;
} //检查文件的保存路径
private function CheckFilePath(){
//如果用户没有指定文件的保存路径
if(empty($this->filepath)){
$this->SetOptions('errorNum',-5);
return false;
} //如果用户设置的文件目录不存在或不可写
if(!file_exists($this->filepath)||!is_writable($this->filepath)){
//尝试创建目录,如果不成功,则设置错误信息
if(!@mkdir($this->filepath,0755)){
$this->SetOptions('errorNum',-4);
return false;
}
} return true;
} //检查上传的文件类型
private function CheckFileType(){
if(in_array(strtolower($this->fileType),$this->allowtype)){
return true;
}else{
$this->SetOptions("errorNum",-1);
return false;
}
} //检查上传的文件大小
private function CheckFileSize(){
if($this->fileSize>$this->maxsize){
$this->SetOptions('errorNum',-2);
return false;
}else{
return true;
}
} //保存文件 移动成功返回true,否则返回false
private function CopyFile(){
if (!$this->errorNum) {
$newPath=rtrim($this->filepath,'/').'/';
$newPath.=$this->newFileName; if(@move_uploaded_file($this->tmpFileName, $newPath)){
return true;
}else{
$this->SetOptions('errorNum',-3);
return false;
}
} else {
return false;
}
} }
?>
HTML 上传页面
PHP接收文件处理页面
上传失败:
上传成功:
注:本文参考于兄弟边PHP教程制作