文件上传类
2015-10-05 23:17
337 查看
<?php /* * 文件上传类 */ class UploadFile { private $filepath; // 指定上传文件保存的路径 private $allowtype = array ( 'gif', 'jpg', 'png', 'jpeg' ); // 充许上传文件的类型 private $maxsize = 1000000; // 允上传文件的大小 1M private $israndname = true; // 是否随机重命名, 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 ) { $key = strtolower ( $key ); // 查看用户参数中数组的下标是否和成员属性名相同 if (! in_array ( $key, get_class_vars ( get_class ( $this ) ) )) { continue; } $this->setOption ( $key, $val ); } } // 用来上传一个文件 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 )) { $errors = 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) { $fileNames = array (); 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 getError() { $str = "出错啦:"; 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; } // 用来检查文件上传路径 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; } private function setOption($key, $val) { $this->$key = $val; } 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) { $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] ) ); $this->setOption ( 'fileSize', $size ); return true; } // 用于获取上传后文件的文件名 function getNewFileName() { return $this->newFileName; } // 上传如果失败,则调用这个方法,就可以查看错误报告 function getErrorMsg() { return $this->errorMess; } } ?>
实例演示:
<?php include './UploadFile.class.php'; $upfileconfig = array( 'filepath'=>'attachements', 'allowtype'=>array('gif', 'jpg', 'png', 'jpeg', 'pptx', 'docx'), 'maxsize'=>3000000 ); $upfile = new UploadFile($upfileconfig); $upfile->uploadFile('uploadfile'); //echo $upfile->getErrorMsg(); 遇到错误可用此方法查看 ?>
相关文章推荐
- activity launchMode总结
- C语言编译全过程
- HDU 5495(dfs)
- 【LeetCode with Python】 ZigZag Conversion
- HDOJ 5363 Key Set (快速幂取模)
- javascript项目实战之原生js模拟淘宝购物车
- 2015第41周一
- javascript项目实战之原生js模拟淘宝购物车
- php操作zip文件
- linu学习笔记(3)-shell常用命令
- cookie 简单理解
- [深入理解Java虚拟机]第三章 内存分配与回收策略
- Codeforces Round #323 (Div. 1) C. Superior Periodic Subarrays
- hdu 3951 硬币围成一圈(博弈)
- php中的绘图技术
- const函数特点
- php文件下载函数
- iOS-面试助攻(二)
- 测试多条数据显示
- 项目人力资源管理总结