PHP.12-PHP-设计文件上传类

时间:2022-06-04 21:46:12

设计文件上传类

PHP参数详解】{文件上传

**********************

*#构造方法编写

**********************

此种传参方法规定必须用户必须按响应位置输入,并不能只输出其中某一个或几个参数的值  【使用中不方便,不推荐使用】

PHP.12-PHP-设计文件上传类

PHP.12-PHP-设计文件上传类

让用户不用按位置传参数,可任意输出其中某一个或几个参数,其余使用默认值  【按数组传递】

#利用数组传参

PHP.12-PHP-设计文件上传类

****************************************

*上传文件的方法【限制大小、限制类型、是否随机文件名,报错信息】

****************************************

多个方法用到同一变量,设置为全局变量

PHP.12-PHP-设计文件上传类

$_FILES函数详解

PHP.12-PHP-设计文件上传类

设置错误号

PHP.12-PHP-设计文件上传类

获得成员属性

PHP.12-PHP-设计文件上传类

上传文件

PHP.12-PHP-设计文件上传类

 拷贝文件到指定目录

先做随机生成文件名

PHP.12-PHP-设计文件上传类

调用设置新文件名函数

PHP.12-PHP-设计文件上传类

PHP.12-PHP-设计文件上传类

判断是否成功,拷贝文件方法

PHP.12-PHP-设计文件上传类

PHP.12-PHP-设计文件上传类

多文件上传【保持调用方法不变】

PHP.12-PHP-设计文件上传类

PHP.12-PHP-设计文件上传类

PHP.12-PHP-设计文件上传类

主要代码

FileLoad.class

 <?php
class FileUpload {
private $filepath; //指定上传文件保存的路径,一般不用默认
private $allowtype=array('gif','jpg','png','jpeg');//允许上传文件类型
private $maxsize=1000000; //允许上传的最大长度1M
private $israndname=true; //是否随机重命名,false不随机 private $originName; //源文件名
private $tmpFileName; //临时文件名
private $fileType; //文件类型
private $fileSize; //文件大小
private $newFileName; //新文件名
private $errorNum=0; //错误号
private $errorMess=""; //用来提供错误报告 //用于对上传文件初始化
//1.指定上传文件路径,2、允许的类型,3、限制大小,4、是否使用随机文件名称
//让用户可以不用按位置传参数,后面参数给值不用将前几个提供值,使用默认值
function __construct($options=array()) {//构造方法,创建对象
foreach($options as $key=>$val){
//查看用户参数中数组的下标值是否和成员属性名相同;get_class_vars()得到类的属性;get_class获得类名
if(!in_array($key,get_class_vars(get_class($this)))){
continue;
} $this->setOption($key,$val);//传输参数
} } private function setOption($key,$val){ //定义私有方法,设置值
$this->$key=$val;
} /************************都需要获得成员属性*************************************/
private function getError(){
$str="上传文件<font color='red'>$this->originName</font>时出错"; switch($this->errorNum){
case 4: $str .="没有文件被上传";break;
case 3: $str .="文件只被部分上传";break;
case 2: $str .="上传文件超过了HTML表单中MAX_FILE_SIZE选项指定的值";break;
case 1: $str .="上传文件超过了php.ini中upload_max_filesize选项的值";break;
case -1: $str .="未允许的类型";break;
case -2: $str .="文件过大,上传文件不能超过{$this->maxSize}个字节";break;
case -3: $str .="上传失败";break;
case -4: $str .="建立存放上传文件目录失败,请重新指定上传目录";break;
case -5: $str .="必须指定上传文件的路径";break; default: $str .="未知错误"; } return $str.'<br>';
} private function checkFilePath(){//用来检查文件上传路径
if(empty($this->filepath)){ //判断文件路径是否为空
$this->setOption('errorNum',-5);
return false;
}
if(!file_exists($this->filepath) || !is_writable($this->filepath)){//判断文件是否存在,或是否可写
if(!@mkdir($this->filepath,0755)){
$this->setOption('errorNum',-4);
return false;
}
}
return true;
}
private function checkFileSize(){//用来检查文件上传大小
if($this->fileSize > $this->maxsize){
$this->setOption('errorNum',-2); //设置错误号
return false;
}else{
return true;
}
}
private function checkFileType(){//用来检查文件上传类型
if(in_array(strtolower($this->fileType),$this->allowtype)){
return true;
}else{
$this->setOption('errorNum',-1);
return false;
}
} private function setNewFileName(){//设置上传文件名称
if($this->israndname){
$this->setOption('newFileName',$this->proRandName());
}else {
$this->setOption('newFileName',$this->originName);
}
} private function proRandName(){//设置随机文件名称
$fileName=date("YmdHis")."_".rand(100,999);
return $fileName.'.'.$this->fileType;
}
/**************************************************************/ function uploadFile($fileField){//用于上传文件的方法
$return=true;
//检查文件上传路径是否正确
if(!$this->checkFilePath()){
$this->errorMess=$this->getError();
return false;
} $name=$_FILES[$fileField]['name'];
$tmp_name=$_FILES[$fileField]['tmp_name'];
$size=$_FILES[$fileField]['size'];
$error=$_FILES[$fileField]['error'];
/*********************************多个文件上传*******************************************************/ if(is_Array($name)){ //判断文件名是不是数组(即多上传)
$error=array(); for($i=0;$i<count($name); $i++){
if($this->setFiles($name[$i], $tmp_name[$i], $size[$i], $error[$i])){
if(!$this->checkFileSize() || !$this->checkFileType()){
$errors[]=$this->getError();
$return=false;
} }else{
$error[]=$this->getError();
$return=false;
} if(!$return) //如果此次有错误,下一次循环必须初始化
$this->setFiles(); } if($return){
for($i=0;$i<count($name);$i++){
if($this->setFiles($name[$i], $tmp_name[$i], $size[$i], $error[$i])){
$this->setNewFileName();
if(!$this->copyFile()){
$errors=$this->getError();
$return=false;
}else {
$fileNames[]=$this->newFileName;
}
} }
$this->newFileName=$fileNames; }
//打包错误消息到数组
$this->errorMess=$errors;
return $return; }else {
/***************************************单个文件上传********************************************/
if($this->setFiles($name,$tmp_name,$size,$error)){//调用传入参数方法
if($this->checkFileSize() && $this->checkFileType()){ //检查文件大小和类型
$this->setNewFileName(); if($this->copyFile()){
return true;
}else {
$return=false;
} }else{ $return=false;
} }else{
$return=false;
} if(!$return) //调用错误提示的信息
$this->errorMess=$this->getError(); return $return; } } private function copyFile(){
if(!$this->errorNum){
$filepath=rtrim($this->filepath,'/').'/'; //删除右边的斜线,再加上
$filepath.=$this->newFileName; if(@move_uploaded_file($this->tmpFileName,$filepath)){//移动临时文件到指定文件夹
return true;
}else {
$this->setOption('errorNum',-3);
return false;
}
}else {
return false;
}
} //设置和$_FILES有关的内容
private function setFiles($name="",$tmp_name='',$size=0,$error=0){
//调用setOption方法,接收参数
$this->setOption('errorNum',$error); if($error){ //若有错误,则无需继续往下执行
return false;
} $this->setOption('originName',$name);
$this->setOption('tmpFileName',$tmp_name);
$arrStr=explode('.',$name); //以点分割文件名输入数组
$this->setOption('fileType',strtolower($arrStr[count($arrStr)-1]));//取最后一个数组的值(后缀名);strolower:转换为小写
$this->setOption('fileSize',$size); return true;
} function getNewFileName(){//用于获取上传后的文件名
return $this->newFileName;
} function getErrorMsg(){//上传失败后,显示错误报告
return $this->errorMess;
} }
?>

upload

 <?php
require "FileUpload.class.php"; //包含此类 $up=new FileUpload(array('israndname'=>true,'allowtype'=>array('jpg','doc','php','gif'),'filepath'=>'./uploads/','maxsize'=>2000000));//上传文件类实例化,按位置传递 echo '<pre>'; //输出圆形 if($up->uploadFile('spic')){
print_r($up->getNewFileName()); //print_r以数组形式打印
}else{
print_r($up->getErrorMsg());
} echo '</pre>'
// var_dump($up);//打印对象up,输出返回内容
?>