php实现文件上传
存档:
upload1.html(单文件上传)
1 <html> 2 <head> 3 <title>单个文件上传</title> 4 </head> 5 <body> 6 <form action="upload.php" method="post" enctype="multipart/form-data"> 7 <input type="hidden" name="MAX_FILE_SIZE" value="1000000"> 8 选择文件:<input type="file" name="myfile"> 9 <input type="submit" value="上传文件"> 10 </form> 11 </body> 12 </html>
upload2.html(多文件上传)
1 <html> 2 <head> 3 <title>多文件上传</title> 4 </head> 5 <body> 6 <form action="upload.php" method="post" enctype="multipart/form-data"> 7 <input type="hidden" name="MAX_FILE_SIZE" value="1000000"> 8 选择文件1:<input type="file" name="myfile[]"><br> 9 选择文件2:<input type="file" name="myfile[]"><br> 10 选择文件3:<input type="file" name="myfile[]"><br> 11 <input type="submit" value="上传文件"> 12 </form> 13 </body> 14 </html>
upload.php
1 <?php 2 require "fileupload.class.php"; 3 $up=new FileUpload; 4 $up ->set('path','./newpath/') 5 ->set('size',1000000) 6 ->set('allowtype',array('gif','jpg','png')) 7 ->set('israndname',false); 8 if($up->upload('myfile')){ 9 print_r($up->getFileName()); 10 } 11 else{ 12 print_r($up->getErrorMsg()); 13 } 14 ?>
fileupload.class.php
1 <?php 2 class FileUpload{ 3 private $path="./uploads"; 4 private $allowtype=array('jpg','gif','png'); 5 private $maxsize=1000000; 6 private $israndname=true; 7 private $originName; 8 private $tmpFileName; 9 private $fileType; 10 private $fileSize; 11 private $newFileName; 12 private $errorNum=0; 13 private $errorMess=""; 14 15 function set($key,$val){ 16 $key=strtolower($key); 17 if(array_key_exists($key,get_class_vars(get_class($this)))){ 18 $this->setOption($key,$val); 19 } 20 return $this; 21 } 22 23 function upload($fileField){ 24 $return=true; 25 if(!$this->checkFilePath()){ 26 $this->errorMess=$this->getError(); 27 return false; 28 } 29 $name=$_FILES[$fileField]['name']; 30 $tmp_name=$_FILES[$fileField]['tmp_name']; 31 $size=$_FILES[$fileField]['size']; 32 $error=$_FILES[$fileField]['error']; 33 if(is_Array($name)){ 34 $errors=array(); 35 for($i=0;$i<count($name);$i++){ 36 if($this->setFiles($name[$i],$tmp_name[$i],$size[$i],$error[$i])){ 37 if(!$this->checkFileSize()||!$this->checkFileType()){ 38 $errors[]=$this->getError(); 39 $return=false; 40 } 41 } 42 else{ 43 $errors[]=$this->getError(); 44 $return=false; 45 } 46 if(!$return){ 47 $this->setFiles(); 48 } 49 } 50 if($return){ 51 $fileNames=array(); 52 for($i=0;$i<count($name);$i++){ 53 if($this->setFiles($name[$i],$tmp_name[$i],$size[$i],$error[$i])){ 54 $this->setNewFileName(); 55 if(!$this->copyFile()){ 56 $errors[]=$this->getError(); 57 $return=false; 58 } 59 $fileNames[]=$this->newFileName; 60 } 61 } 62 $this->newFileName=$fileNames; 63 } 64 $this->errorMess=$errors; 65 return $return; 66 } 67 else{ 68 if($this->setFiles($name,$tmp_name,$size,$error)){ 69 if($this->checkFileSize()&&$this->checkFileType()){ 70 $this->setNewFileName(); 71 if($this->copyFile()){ 72 return true; 73 } 74 else{ 75 $return=false; 76 } 77 } 78 else{ 79 $return=false; 80 } 81 } 82 else{ 83 $return=false; 84 } 85 if(!$return){ 86 $this->errorMess=$this->getError(); 87 } 88 return $return; 89 } 90 } 91 92 public function getFileName(){ 93 return $this->newFileName; 94 } 95 96 public function getErrorMsg(){ 97 return $this->errorMess; 98 } 99 100 private function getError(){ 101 $str="上传文件<font color='red'>{$this->originName}</font>时出错:"; 102 switch($this->errorNum){ 103 case 4: 104 $str.="没有文件被上传"; 105 break; 106 case 3: 107 $str.="文件只有部分被上传"; 108 break; 109 case 2: 110 $str.="上传的文件大小超过了HTML表单中MAX_FILE_SIZE选项指定的值"; 111 break; 112 case 1: 113 $str.="上传的文件超过了php.ini中的upload_max_filesize选定限制的值"; 114 break; 115 case -1: 116 $str.="未允许类型"; 117 break; 118 case -2: 119 $str.="文件过大,上传的文件不能超过{$this->maxsize}个字节"; 120 break; 121 case -3: 122 $str.="上传失败"; 123 break; 124 case -4: 125 $str.="建立存放上传文件目录失败,请重新指定上传目录"; 126 break; 127 case -5: 128 $str.="必须指定上传文件的路径"; 129 break; 130 default: 131 $str.="未知错误"; 132 //break; 133 } 134 return $str.'<br>'; 135 } 136 137 private function setFiles($name="",$tmp_name="",$size=0,$error=0){ 138 $this->setOption('errorNum',$error); 139 if($error){ 140 return false; 141 } 142 $this->setOption('originName',$name); 143 $this->setOption('tmpFileName',$tmp_name); 144 $aryStr=explode(".",$name); 145 $this->setOption('fileType',strtolower($aryStr[count($aryStr)-1])); 146 $this->setOption('fileSize',$size); 147 return true; 148 } 149 150 private function setOption($key,$val){ 151 $this->$key=$val; 152 } 153 154 private function setNewFileName(){ 155 if($this->israndname){ 156 $this->setOption('newFileName',$this->proRandName()); 157 } 158 else{ 159 $this->setOption('newFileName',$this->originName); 160 } 161 } 162 163 private function checkFileType(){ 164 if(in_array(strtolower($this->fileType),$this->allowtype)){ 165 return true; 166 } 167 else{ 168 $this->setOption('errorNum',-1); 169 return false; 170 } 171 } 172 173 private function checkFileSize(){ 174 if($this->fileSize>$this->maxsize){ 175 $this->setOption('errorNum',-2); 176 return false; 177 } 178 else{ 179 return true; 180 } 181 } 182 183 private function checkFilePath(){ 184 if(empty($this->path)){ 185 $this->setOption('errorNum',-5); 186 return false; 187 } 188 if(!file_exists($this->path)||!is_writable($this->path)){ 189 if(!@mkdir($this->path,0755)){ 190 $this->setOption('errorNum',-4); 191 return false; 192 } 193 } 194 return true; 195 } 196 197 private function proRandName(){ 198 $fileName = date('YmdHis')."_".rand(100,999); 199 return $fileName.'.'.$this->fileType; 200 } 201 202 private function copyFile(){ 203 if(!$this->errorNum){ 204 $path=rtrim($this->path,'/').'/'; 205 $path.=$this->newFileName; 206 if(@move_uploaded_file($this->tmpFileName,$path)){ 207 return true; 208 } 209 else{ 210 $this->setOption('errorNum',-3); 211 return false; 212 } 213 } 214 else{ 215 return false; 216 } 217 } 218 } 219 ?>
结果如下:
作 者:Angel_Kitty
出 处:https://www.cnblogs.com/ECJTUACM-873284962/
关于作者:阿里云ACE,目前主要研究方向是Web安全漏洞以及反序列化。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!
欢迎大家关注我的微信公众号IT老实人(IThonest),如果您觉得文章对您有很大的帮助,您可以考虑赏博主一杯咖啡以资鼓励,您的肯定将是我最大的动力。thx.
![](https://images.cnblogs.com/cnblogs_com/ECJTUACM-873284962/1318325/o_donate.png)
我的公众号是IT老实人(IThonest),一个有故事的公众号,欢迎大家来这里讨论,共同进步,不断学习才能不断进步。扫下面的二维码或者收藏下面的二维码关注吧(长按下面的二维码图片、并选择识别图中的二维码),个人QQ和微信的二维码也已给出,扫描下面👇的二维码一起来讨论吧!!!
![](https://images.cnblogs.com/cnblogs_com/ECJTUACM-873284962/1318325/o_chat.png)
欢迎大家关注我的Github,一些文章的备份和平常做的一些项目会存放在这里。