您的位置:首页 > 编程语言 > PHP开发

PHP封装一个通用好用的文件上传处理类

2014-01-08 21:35 761 查看

封装一个文件上传类完成基本功能如下:

1.可上传多个或单个文件

2.上传成功返回一个或多个文件名

3.上传失败则返回每个失败文件的错误信息

上传类中的基本功能:

1.构造参数,用户可以自定义配置参数,不限大小写,不限个数,不限顺序

2.检测:保存路径、文件类型、文件大小、文件名是否为随机文件名等

3.错误消息:如果在判断过程中出现错误,则生成错误号并返回错误消息

上传类如下:

<?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教程制作
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: