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

设计文件上传类

PHP参数详解】{文件上传

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

*#构造方法编写

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

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

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

#利用数组传参

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

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

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

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

$_FILES函数详解

 设置错误号

 

 

获得成员属性

上传文件

 拷贝文件到指定目录

先做随机生成文件名

调用设置新文件名函数

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

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

主要代码

FileLoad.class

  1 <?php
  2     class FileUpload {
  3         private $filepath;    //指定上传文件保存的路径,一般不用默认
  4         private $allowtype=array('gif','jpg','png','jpeg');//允许上传文件类型
  5         private $maxsize=1000000;    //允许上传的最大长度1M
  6         private $israndname=true;    //是否随机重命名,false不随机
  7         
  8         private $originName;    //源文件名
  9         private $tmpFileName;    //临时文件名
 10         private $fileType;    //文件类型
 11         private $fileSize;    //文件大小
 12         private $newFileName;    //新文件名
 13         private $errorNum=0;    //错误号
 14         private $errorMess="";    //用来提供错误报告
 15 
 16         //用于对上传文件初始化
 17         //1.指定上传文件路径,2、允许的类型,3、限制大小,4、是否使用随机文件名称
 18         //让用户可以不用按位置传参数,后面参数给值不用将前几个提供值,使用默认值
 19         function __construct($options=array()) {//构造方法,创建对象
 20             foreach($options as $key=>$val){
 21                 //查看用户参数中数组的下标值是否和成员属性名相同;get_class_vars()得到类的属性;get_class获得类名
 22                 if(!in_array($key,get_class_vars(get_class($this)))){
 23                     continue;
 24                 }
 25 
 26                 $this->setOption($key,$val);//传输参数
 27             }
 28             
 29         }
 30 
 31 
 32         private function setOption($key,$val){ //定义私有方法,设置值
 33             $this->$key=$val;
 34         }
 35 
 36         /************************都需要获得成员属性*************************************/
 37         private function getError(){
 38             $str="上传文件<font color='red'>$this->originName</font>时出错";
 39 
 40             switch($this->errorNum){
 41                 case 4: $str .="没有文件被上传";break;
 42                 case 3: $str .="文件只被部分上传";break;
 43                 case 2: $str .="上传文件超过了HTML表单中MAX_FILE_SIZE选项指定的值";break;
 44                 case 1: $str .="上传文件超过了php.ini中upload_max_filesize选项的值";break;
 45                 case -1: $str .="未允许的类型";break;
 46                 case -2: $str .="文件过大,上传文件不能超过{$this->maxSize}个字节";break;
 47                 case -3: $str .="上传失败";break;
 48                 case -4: $str .="建立存放上传文件目录失败,请重新指定上传目录";break;
 49                 case -5: $str .="必须指定上传文件的路径";break;
 50 
 51                 default: $str .="未知错误";
 52 
 53             }
 54 
 55             return $str.'<br>';
 56         }
 57 
 58         private function checkFilePath(){//用来检查文件上传路径
 59             if(empty($this->filepath)){    //判断文件路径是否为空
 60                 $this->setOption('errorNum',-5);
 61                 return false;
 62             }
 63             if(!file_exists($this->filepath) || !is_writable($this->filepath)){//判断文件是否存在,或是否可写
 64                 if(!@mkdir($this->filepath,0755)){
 65                     $this->setOption('errorNum',-4);
 66                     return false;
 67                 }
 68             }
 69             return true;
 70         }
 71         private function checkFileSize(){//用来检查文件上传大小
 72             if($this->fileSize > $this->maxsize){
 73                 $this->setOption('errorNum',-2); //设置错误号
 74                 return false;
 75             }else{
 76                 return true;
 77             }
 78         }
 79         private function checkFileType(){//用来检查文件上传类型
 80             if(in_array(strtolower($this->fileType),$this->allowtype)){
 81                 return true;
 82             }else{
 83                 $this->setOption('errorNum',-1);
 84                 return false;
 85             }
 86         }
 87 
 88         private function setNewFileName(){//设置上传文件名称
 89             if($this->israndname){
 90                 $this->setOption('newFileName',$this->proRandName());
 91             }else {
 92                 $this->setOption('newFileName',$this->originName);
 93             }
 94         }
 95 
 96         private function proRandName(){//设置随机文件名称
 97             $fileName=date("YmdHis")."_".rand(100,999);
 98             return $fileName.'.'.$this->fileType;
 99         }
100         /**************************************************************/
101 
102         function uploadFile($fileField){//用于上传文件的方法
103             $return=true;
104         //检查文件上传路径是否正确
105             if(!$this->checkFilePath()){
106                 $this->errorMess=$this->getError();
107                 return false;
108             }
109 
110 
111             $name=$_FILES[$fileField]['name'];
112             $tmp_name=$_FILES[$fileField]['tmp_name'];
113             $size=$_FILES[$fileField]['size'];
114             $error=$_FILES[$fileField]['error'];
115         /*********************************多个文件上传*******************************************************/
116 
117             if(is_Array($name)){    //判断文件名是不是数组(即多上传)
118                 $error=array();
119 
120 
121                 for($i=0;$i<count($name); $i++){
122                     if($this->setFiles($name[$i], $tmp_name[$i], $size[$i], $error[$i])){
123                             if(!$this->checkFileSize() || !$this->checkFileType()){
124                                 $errors[]=$this->getError();
125                                 $return=false;
126                             }
127 
128 
129                         }else{
130                             $error[]=$this->getError();
131                             $return=false;
132                         }
133 
134                         if(!$return)    //如果此次有错误,下一次循环必须初始化
135                             $this->setFiles();
136                         
137                 }
138 
139                     if($return){
140                         for($i=0;$i<count($name);$i++){
141                             if($this->setFiles($name[$i], $tmp_name[$i], $size[$i], $error[$i])){
142                                 $this->setNewFileName();
143                                 if(!$this->copyFile()){
144                                     $errors=$this->getError();
145                                     $return=false;
146                                 }else {
147                                     $fileNames[]=$this->newFileName;
148                                 }
149                             }
150                             
151                         }
152                         $this->newFileName=$fileNames;
153 
154                     }
155                     //打包错误消息到数组
156                     $this->errorMess=$errors;
157                     return $return;
158                     
159 
160             }else {
161         /***************************************单个文件上传********************************************/
162                 if($this->setFiles($name,$tmp_name,$size,$error)){//调用传入参数方法
163                     if($this->checkFileSize() && $this->checkFileType()){    //检查文件大小和类型
164                         $this->setNewFileName();
165 
166 
167                         if($this->copyFile()){
168                             return true;
169                         }else {
170                             $return=false;
171                         }
172 
173                     }else{
174                             
175                         $return=false;
176                     } 
177                 
178                 }else{
179                     $return=false;
180                 }
181                 
182                 if(!$return)        //调用错误提示的信息
183                     $this->errorMess=$this->getError();
184                 
185                 return $return;
186             
187             }
188 
189         }
190 
191         private function copyFile(){
192             if(!$this->errorNum){
193                 $filepath=rtrim($this->filepath,'/').'/';    //删除右边的斜线,再加上
194                 $filepath.=$this->newFileName;
195 
196                 if(@move_uploaded_file($this->tmpFileName,$filepath)){//移动临时文件到指定文件夹
197                     return true;
198                 }else {
199                     $this->setOption('errorNum',-3);
200                     return false;
201                 }
202             }else {
203                 return false;
204             }
205         }
206         
207         //设置和$_FILES有关的内容
208         private function setFiles($name="",$tmp_name='',$size=0,$error=0){
209             //调用setOption方法,接收参数
210             $this->setOption('errorNum',$error);
211 
212             if($error){    //若有错误,则无需继续往下执行
213                 return false;
214             }
215 
216             $this->setOption('originName',$name);
217             $this->setOption('tmpFileName',$tmp_name);
218             $arrStr=explode('.',$name);    //以点分割文件名输入数组
219             $this->setOption('fileType',strtolower($arrStr[count($arrStr)-1]));//取最后一个数组的值(后缀名);strolower:转换为小写    
220             $this->setOption('fileSize',$size);
221 
222             return true;
223         }
224 
225         function getNewFileName(){//用于获取上传后的文件名
226             return $this->newFileName;
227         }
228 
229         
230         function getErrorMsg(){//上传失败后,显示错误报告
231             return $this->errorMess;
232         }
233 
234     }        
235 ?>

upload

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

 

 

 

 

原文地址:https://www.cnblogs.com/zixuanfy/p/6021547.html