自定义MVC框架之工具类-文件上传类
截止目前已经改造了3个类:
该文件上传类功能如下:
1,允许定制上传的文件类型,文件mime信息,文件大小
2,自由定制文件名是随机还是保持原来的文件名
3,谨慎的检查,友好的错误提示,精确定位文件上传哪一步出问题
测试结果:
ghostwu@ghostwu:~/php/senior_php/upload$ tree . ├── 19502QV8-6.jpg ├── Upload │ ├── ghostwu_5a94beb3b2690.jpg │ ├── ghostwu_5a94c727a1f1a.php │ └── ghostwu_5a94c740615dc.html ├── upload.html └── upload.php
upload.php:
1 <meta charset="utf-8" /> 2 <?php 3 4 class Upload { 5 //上传路径 6 private $path = './Upload'; 7 //允许的文件类型 8 private $allowFileType = [ 'jpg', 'png', 'jpeg', 'wbmp', 'gif' ]; 9 //允许的mime信息 10 private $allowMime = [ 'image/jpeg', 'image/gif', 'image/png', 'image/wbmp' ]; 11 //允许的最大文件大小 12 private $maxSize = 2048000; 13 //运行随机文件名 14 private $enableRandName = true; 15 //文件前缀 16 private $prefix = 'ghostwu_'; 17 18 //错误号 19 private $errorNo; 20 //错误信息 21 private $errorInfo; 22 23 //文件原来的名称 24 private $originName; 25 //新的文件名称 26 private $newName; 27 //文件后缀 28 private $suffix; 29 //文件大小 30 private $size; 31 //文件mime信息 32 private $mime; 33 //临时文件名 34 private $tmpName; 35 36 37 public function __construct( $fileInfo = [] ){ 38 foreach ($fileInfo as $k => $v ) { 39 $this->setProperty( $k, $v ); 40 } 41 } 42 43 //设置成员属性 44 public function setProperty( $k, $v ){ 45 $property = array_keys( get_class_vars( __CLASS__ ) ); 46 if( in_array( $k, $property ) ){ 47 $this->$k = $v; 48 } 49 } 50 51 public function __get( $key ) { 52 if( $key == 'errorNo' ) { 53 return $this->errorNo; 54 }else if ( $key == 'errorInfo' ) { 55 return $this->getErrorInfo(); 56 } 57 } 58 59 protected function getErrorInfo(){ 60 $info = ''; 61 switch( $this->errorNo ){ 62 case 1000: 63 $info = '没有设置上传路径'; 64 break; 65 case 1001: 66 $info = '上传路径不存在,或者没有写权限'; 67 break; 68 case 1002: 69 $info = '文件大小超过限制'; 70 break; 71 case 1003: 72 $info = '文件的mime信息不在允许范围内'; 73 break; 74 case 1004: 75 $info = '不允许上传这种类型的文件'; 76 break; 77 case 1006: 78 $info = '文件不是通过表单上传的'; 79 break; 80 case 1007: 81 $info = '文件移动失败'; 82 break; 83 case 1: 84 $info = '文件超出php.ini设置的大小'; 85 break; 86 case 2: 87 $info = '超出html表单设置的大小'; 88 break; 89 case 3: 90 $info = '文件只有部分被上传'; 91 break; 92 case 4: 93 $info = '没有文件被上传'; 94 break; 95 case 6: 96 $info = '找不到临时文件'; 97 break; 98 case 7: 99 $info = '文件写入失败'; 100 break; 101 } 102 103 return $info; 104 } 105 106 protected function check(){ 107 if( !file_exists( $this->path ) || !is_dir( $this->path ) ){ 108 return mkdir( $this->path, 0777, true ); 109 } 110 if( !is_writable( $this->path ) ){ 111 return chmod( $this->path, 0777 ); 112 } 113 return true; 114 } 115 116 public function upload( $name ){ 117 //判断是否设置了上传路径 118 if( empty( $this->path ) ) { 119 $this->setProperty( 'errorNo', 1000 ); 120 return false; 121 } 122 //判断路径是否存在,可写 123 if( !$this->check() ) { 124 $this->setProperty( 'errorNo', 1001 ); 125 return false; 126 } 127 //判断上传文件是否错误,提取原文件信息 128 $errorno = $_FILES[$name]['error']; 129 if( $errorno ) { 130 $this->setProperty( 'errorNo', $errorno ); 131 return false; 132 }else { 133 $this->getFileInfo( $name ); 134 } 135 //判断文件是否符合上传要求(大小,后缀,mime) 136 if( !$this->checkSize() 137 || !$this->checkMime() 138 || !$this->checkSuffix() ) { 139 return false; 140 } 141 //生成新的文件名 142 $this->newName = $this->createNewName(); 143 //判断是否为上传文件 144 if( is_uploaded_file( $this->tmpName ) ) { 145 if( move_uploaded_file( $this->tmpName, $this->path . '/' . $this->newName ) ){ 146 return $this->path . '/' . $this->newName; 147 }else { 148 $this->setProperty( 'errorNo', 1007 ); 149 return false; 150 } 151 }else { 152 $this->setProperty( 'errorNo', 1006 ); 153 return false; 154 } 155 } 156 157 protected function createNewName(){ 158 if ( $this->enableRandName ) { 159 $name = $this->prefix . uniqid() . '.' . $this->suffix; 160 }else { 161 $name = $this->prefix . $this->originName; 162 } 163 return $name; 164 } 165 166 protected function getFileInfo( $name ){ 167 $this->originName = $_FILES[$name]['name']; 168 $this->mime = $_FILES[$name]['type']; 169 print_r( $this->mime ); 170 $this->tmpName = $_FILES[$name]['tmp_name']; 171 $this->size = $_FILES[$name]['size']; 172 $this->suffix = pathinfo( $this->originName )['extension']; 173 } 174 175 protected function checkSize(){ 176 if( $this->size > $this->maxSize ) { 177 $this->setProperty( 'errorNo', 1002 ); 178 return false; 179 } 180 return true; 181 } 182 183 protected function checkMime(){ 184 print_r( $this->allowMime ); 185 if( !in_array( $this->mime, $this->allowMime ) ) { 186 $this->setProperty( 'errorNo', 1003 ); 187 return false; 188 } 189 return true; 190 } 191 192 protected function checkSuffix(){ 193 if( !in_array( $this->suffix, $this->allowFileType ) ) { 194 $this->setProperty( 'errorNo', 1004 ); 195 return false; 196 } 197 return true; 198 } 199 200 } 201 202 $upload = new Upload( [ 'maxSize' => 204800 ] ); 203 $upload->setProperty( 'allowFileType', ['jpg','jpeg', 'gif', 'php', 'html'] ); 204 $upload->setProperty( 'allowMime', [ 'image/jpeg', 'image/gif', 'image/wbmp', 'application/x-php', 'text/html' ] ); 205 206 $upload->upload( 'photo' ); 207 208 echo $upload->errorNo . '<br/>'; 209 echo $upload->errorInfo . '<br/>'; 210 211 ?>
upload.html
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8" /> 5 <meta name="viewport" content="width=device-width" /> 6 <title>文件上传-by ghostwu</title> 7 </head> 8 <body> 9 <form action="upload.php" method="post" enctype="multipart/form-data" > 10 <input type="file" name="photo" id="photo" /> 11 <input type="submit" name="upload" id="upload" value="上传" /> 12 </form> 13 </body> 14 </html>
作者:ghostwu, 出处:http://www.cnblogs.com/ghostwu
博客大多数文章均属原创,欢迎转载,且在文章页面明显位置给出原文连接