当前位置:Gxlcms > PHP教程 > 完全封装好的php上传文件类

完全封装好的php上传文件类

时间:2021-07-01 10:21:17 帮助过:15人阅读

  1. class FileUpload {
  2. private $filepath; //指定上传文件保存的路径
  3. private $allowtype=array('gif', 'jpg', 'png', 'jpeg'); //充许上传文件的类型
  4. private $maxsize=1000000; //允上传文件的最大长度 1M
  5. private $israndname=true; //是否随机重命名, false不随机,使用原文件名
  6. private $originName; //源文件名称
  7. private $tmpFileName; //临时文件名
  8. private $fileType; //文件类型
  9. private $fileSize; //文件大小
  10. private $newFileName; //新文件名
  11. private $errorNum=0; //错误号
  12. private $errorMess=""; //用来提供错误报告
  13. //用于对上传文件初使化
  14. //1. 指定上传路径, 2,充许的类型, 3,限制大小, 4,是否使用随机文件名称
  15. //让用户可以不用按位置传参数,后面参数给值不用将前几个参数也提供值
  16. function __construct($options=array()){
  17. foreach($options as $key=>$val){
  18. $key=strtolower($key);
  19. //查看用户参数中数组的下标是否和成员属性名相同
  20. if(!in_array($key,get_class_vars(get_class($this)))){
  21. continue;
  22. }
  23. $this->setOption($key, $val);
  24. }
  25. }
  26. private function getError(){
  27. $str="上传文件{$this->originName}时出错:";
  28. switch($this->errorNum){
  29. case 4: $str .= "没有文件被上传"; break;
  30. case 3: $str .= "文件只被部分上传"; break;
  31. case 2: $str .= "上传文件超过了HTML表单中MAX_FILE_SIZE选项指定的值"; break;
  32. case 1: $str .= "上传文件超过了php.ini 中upload_max_filesize选项的值"; break;
  33. case -1: $str .= "末充许的类型"; break;
  34. case -2: $str .= "文件过大,上传文件不能超过{$this->maxSize}个字节"; break;
  35. case -3: $str .= "上传失败"; break;
  36. case -4: $str .= "建立存放上传文件目录失败,请重新指定上传目录"; break;
  37. case -5: $str .= "必须指定上传文件的路径"; break;
  38. default: $str .= "末知错误";
  39. }
  40. return $str.'
    ';
  41. }
  42. //用来检查文件上传路径
  43. private function checkFilePath(){
  44. if(empty($this->filepath)) {
  45. $this->setOption('errorNum', -5);
  46. return false;
  47. }
  48. if(!file_exists($this->filepath) || !is_writable($this->filepath)){
  49. if(!@mkdir($this->filepath, 0755)){
  50. $this->setOption('errorNum', -4);
  51. return false;
  52. }
  53. }
  54. return true;
  55. }
  56. //用来检查文件上传的大小
  57. private function checkFileSize() {
  58. if($this->fileSize > $this->maxsize){
  59. $this->setOPtion('errorNum', '-2');
  60. return false;
  61. }else{
  62. return true;
  63. }
  64. }
  65. //用于检查文件上传类型
  66. private function checkFileType() {
  67. if(in_array(strtolower($this->fileType), $this->allowtype)) {
  68. return true;
  69. }else{
  70. $this->setOption('errorNum', -1);
  71. return false;
  72. }
  73. }
  74. //设置上传后的文件名称
  75. private function setNewFileName(){
  76. if($this->israndname){
  77. $this->setOption('newFileName', $this->proRandName());
  78. } else {
  79. $this->setOption('newFileName', $this->originName);
  80. }
  81. }
  82. //设置随机文件名称
  83. private function proRandName(){
  84. $fileName=date("YmdHis").rand(100,999);
  85. return $fileName.'.'.$this->fileType;
  86. }
  87. private function setOption($key, $val){
  88. $this->$key=$val;
  89. }
  90. //用来上传一个文件
  91. function uploadFile($fileField){
  92. $return=true;
  93. //检查文件上传路径
  94. if(!$this->checkFilePath()){
  95. $this->errorMess=$this->getError();
  96. return false;
  97. }
  98. $name=$_FILES[$fileField]['name'];
  99. $tmp_name=$_FILES[$fileField]['tmp_name'];
  100. $size=$_FILES[$fileField]['size'];
  101. $error=$_FILES[$fileField]['error'];
  102. if(is_Array($name)){
  103. $errors=array();
  104. for($i=0; $iif($this->setFiles($name[$i], $tmp_name[$i], $size[$i], $error[$i])){
  105. if(!$this->checkFileSize() || !$this->checkFileType()){
  106. $errors[]=$this->getError();
  107. $return=false;
  108. }
  109. }else{
  110. $error[]=$this->getError();
  111. $return=false;
  112. }
  113. if(!$return)
  114. $this->setFiles();
  115. }
  116. if($return){
  117. $fileNames=array();
  118. for($i=0; $iif($this->setFiles($name[$i], $tmp_name[$i], $size[$i], $error[$i])){
  119. $this->setNewFileName();
  120. if(!$this->copyFile()){
  121. $errors=$this->getError();
  122. $return=false;
  123. }else{
  124. $fileNames[]=$this->newFileName;
  125. }
  126. }
  127. }
  128. $this->newFileName=$fileNames;
  129. }
  130. $this->errorMess=$errors;
  131. return $return;
  132. } else {
  133. if($this->setFiles($name, $tmp_name, $size, $error)){
  134. if($this->checkFileSize() && $this->checkFileType()){
  135. $this->setNewFileName();
  136. if($this->copyFile()){
  137. return true;
  138. }else{
  139. $return=false;
  140. }
  141. }else{
  142. $return=false;
  143. }
  144. }else{
  145. $return=false;
  146. }
  147. if(!$return)
  148. $this->errorMess=$this->getError();
  149. return $return;
  150. }
  151. }
  152. private function copyFile(){
  153. if(!$this->errorNum){
  154. $filepath=rtrim($this->filepath, '/').'/';
  155. $filepath.=$this->newFileName;
  156. if(@move_uploaded_file($this->tmpFileName, $filepath)) {
  157. return true;
  158. }else{
  159. $this->setOption('errorNum', -3);
  160. return false;
  161. }
  162. }else{
  163. return false;
  164. }
  165. }
  166. //设置和$_FILES有关的内容
  167. private function setFiles($name="", $tmp_name='', $size=0, $error=0){
  168. $this->setOption('errorNum', $error);
  169. if($error){
  170. return false;
  171. }
  172. $this->setOption('originName', $name);
  173. $this->setOption('tmpFileName', $tmp_name);
  174. $arrStr=explode('.', $name);
  175. $this->setOption('fileType', strtolower($arrStr[count($arrStr)-1]));
  176. $this->setOption('fileSize', $size);
  177. return true;
  178. }
  179. //用于获取上传后文件的文件名
  180. function getNewFileName(){
  181. return $this->newFileName;
  182. }
  183. //上传如果失败,则调用这个方法,就可以查看错误报告
  184. function getErrorMsg() {
  185. return $this->errorMess;
  186. }
  187. }
装好, 上传文件, php

人气教程排行