PHP.12-PHP-设计文件上传类
设计文件上传类
**********************
*#构造方法编写
**********************
此种传参方法规定必须用户必须按响应位置输入,并不能只输出其中某一个或几个参数的值 【使用中不方便,不推荐使用】
让用户不用按位置传参数,可任意输出其中某一个或几个参数,其余使用默认值 【按数组传递】
#利用数组传参
****************************************
*上传文件的方法【限制大小、限制类型、是否随机文件名,报错信息】
****************************************
多个方法用到同一变量,设置为全局变量
设置错误号
获得成员属性
上传文件
拷贝文件到指定目录
先做随机生成文件名
调用设置新文件名函数
判断是否成功,拷贝文件方法
多文件上传【保持调用方法不变】
主要代码
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 ?>