php函数封装文件上传类

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

发布日期:

所属分类: Php 标签: