非常经典的PHP文件上传类分享
文件上传是项目开发中比较常见的功能,但文件上传的过程比较繁琐,只要是有文件上传的地方就需要编写这些复杂的代码。为了能在每次开发中降低功能的编写难度,也为了能节省开发时间,通常我们都会将这些反复使用的一段代码封装到一个类中。
<?php
/**
+-----------------------------------------------------------------------------
*文件上传类
+-----------------------------------------------------------------------------
*@authorAdministrator
+-----------------------------------------------------------------------------
*/
classFileUpload{
private$filepath;//保存路径
private$allowtype=array('gif','jpg','jpeg','png','txt');
private$maxsize=1000000;//最大允许上传大小
private$israndname=true;//是否随机
private$orginame;//原始文件名
private$tmpname;//临时文件名
private$newname;//新文件名
private$filetype;//文件类型
private$filesize;//文件大小
private$errornum='';//错误号
private$errormsg;//错误信息
/**
+------------------------------------------------------------------------------
*构造函数
+------------------------------------------------------------------------------
*@paramstring$savepath保存路径
*@paramstring$allowtype允许类型
*@paramstring$maxsize允许大小
*
+------------------------------------------------------------------------------
*/
function__construct($option=array()){
foreach($optionas$key=>$value){
if(!in_array($key,get_class_vars(get_class($this)))){
continue;
}
$this->setOption($key,$value);
}
}
functionuploadfile($field){
$return=true;
if(!$this->CheckPath()){
$this->errormsg=$this->geterrorNum();
returnfalse;
}
$name=$_FILES[$field]['name'];
$tmpname=$_FILES[$field]['tmp_name'];
$filesize=$_FILES[$field]['size'];
$error=$_FILES[$field]['error'];
if(is_array($name)){
$errors=array();
for($i=0;$i<count($name);$i++){
if($this->getFile($name[$i],$tmpname[$i],$filesize[$i],$errors[$i])){
if(!$this->CheckSize()&&!$this->CheckType()){
$errors=$this->getErrorNum();
returnfalse;
}
}else{
$errors=$this->getErrorNum();
returnfalse;
}
if(!$return){
$this->getFile();
}
}
if($return){
$fileNames=array();
for($i=0;$i<count($name);$i++){
if($this->getFile($name[$i],$tmpname[$i],$filesize[$i],$filesize[$i])){
$this->SetFileName();
if(!$this->MoveFile()){
$errors[]=$this->getErrorNum();
$return=false;
}else{
$fileNames[]=$this->getNewName();
}
}
}
$this->newname=$fileNames;
}
$this->errormsg=$errors;
return$return;
}else{
if($this->getFile($name,$tmpname,filesize,$error)){
if(!$this->CheckSize()){
returnfalse;
}
if(!$this->CheckType()){
returnfalse;
}
$this->SetFileName();
if($this->MoveFile()){
returntrue;
}
}else{
returnfalse;
}
if(!$return){
$this->setOption('ErrorNum',0);
$this->errormsg=$this->geterrorNum();
}
return$return;
}
}
/**
+------------------------------------------------------------------------
*设置类属性值函数
+------------------------------------------------------------------------
*@parammix$key
*@parammix$value
*/
privatefunctionsetOption($key,$value){
$key=strtolower($key);
$this->$key=$value;
}
/**
+---------------------------------------------------------------------------
*获取文件变量参数函数
+---------------------------------------------------------------------------
*@paramstring$name
*@paramstring$tmp_name
*@paramnumber$size
*@paramnumber$error
*/
privatefunctiongetFile($name,$tmpname,$filetype,$filesize,$error=0){
$this->setOption('TmpName',$tmpname);
$this->setOption('OrgiName',$name);
$arrstr=explode('.',$name);
$this->setOption('FileType',$arrstr[count($arrstr)-1]);
$this->setOption('FileSize',$filesize);
returntrue;
}
/**
+-------------------------------------------------------------------------
*检查上传路径函数
+-------------------------------------------------------------------------
*@returnboolean
*/
privatefunctionCheckPath(){
if(empty($this->filepath)){
$this->setOption('ErrorNum',-5);
returnfalse;
}
if(!file_exists($this->filepath)||!is_writable($this->filepath)){
if(!@mkdir($this->filepath,0755)){
$this->setOption('ErrorNum',-4);
returnfalse;
}
}
returntrue;
}
privatefunctionIs_Http_Post(){
if(!is_uploaded_file($this->tmpname)){
$this->setOption('ErrorNum',-6);
returnfalse;
}else{
returntrue;
}
}
/**
+--------------------------------------------------------------------
*检查文件尺寸函数
+--------------------------------------------------------------------
*@returnboolean
*/
privatefunctionCheckSize(){
if($this->filesize>$this->maxsize){
$this->setOption('ErrorNum',-2);
returnfalse;
}else{
returntrue;
}
}
/**
+---------------------------------------------------------------
*检查文件类型函数
+---------------------------------------------------------------
*@returnboolean
*/
privatefunctionCheckType(){
if(in_array($this->filetype,$this->allowtype)){
returntrue;
}else{
$this->setOption('ErrorNum',-1);
returnfalse;
}
}
privatefunctionSetFileName(){
if($this->israndname){
$this->setOption('NewName',$this->RandName());
}else{
$this->setOption('NewName',$this->orginame);
}
}
/**
+-----------------------------------------------------------------
*获取新文件名
+------------------------------------------------------------------
*/
publicfunctiongetNewName(){
return$this->newname;
}
privatefunctionRandName(){
$rule=date("YmdHis").rand(0,999);
return$rule.'.'.$this->filetype;
}
privatefunctionMoveFile(){
if($this->errornum){
$filepath=rtrim($this->filaepath,'/').'/';
$filepath.=$this->newname;
if(@move_uploaded_file($this->tmpname,$filepath)){
returntrue;
}else{
$this->errormsg=$this->setOption('ErrorNum',-3);
}
}else{
returnfalse;
}
}
/**
+----------------------------------------------------------------
*错误信息函数
+----------------------------------------------------------------
*@returnstring
*/
functiongetErrorNum(){
$erstr="上传文件<fontcolor='red'>{$this->orginame}</font>出错";
switch($this->errornum){
case4:
$erstr.="没有文件被上传";
break;
case3:
$erstr.="文件只被部分上传";
break;
case2:
$erstr.="上传文件超过了HTML表单MAX_FILE_SIZE指定的值";
break;
case1:
$erstr.="上传文件超过了php.ini配置文件中upload_max_filesize的值";
break;
case0:
$erstr="上传{$this->orginame}成功";
break;
case-1:
$erstr="未允许的类型";
break;
case-2:
$erstr.="文件过大,不能超过{$this->maxsize}个字节";
break;
case-3:
$erstr.="上传失败";
break;
case-4:
$erstr="创建上传目录失败,请重新指定上传目录";
break;
case-5:
$erstr="未指定上传路径";
break;
case-6:
$erstr="非法操作";
break;
default:
$erstr.="未知错误";
}
return$erstr;
}
}
?>
以上就是本文的全部内容,希望对大家学习php程序设计有所帮助。