完全封裝好的php上傳文件類

WBOY
發布: 2016-07-25 08:43:24
原創
835 人瀏覽過
  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. 回傳true;
  138. }else{
  139. $return=false;
  140. }
  141. }else{
  142. $return=false;
  143. }
  144. }else {$return =false;
  145. }
  146. if(!$return)
  147. $this->errorMess=$this->getError();
  148. 回傳$return;
  149. }
  150. }
  151. 不行函數copyFile(){
  152. if(!$this->errorNum){
  153. $filepath=rtrim($this->filepath, '/').' /';
  154. $filepath.=$this->newFileName;
  155. if(@move_uploaded_file($this->tmpFileName, $filepath)) {
  156. 回傳 true;
  157. }else{
  158. $this->setOption('errorNum', -3);
  159. 回傳false;
  160. }
  161. }else{
  162. 回傳false;
  163. }
  164. }
  165. //設定和$_FILES相關的內容
  166. private function setFiles($name="", $tmp_name='', $size=0, $error=0){
  167. $this->setOption(' errorNum', $錯誤);
  168. if($error){
  169. 回傳false;
  170. }
  171. $this->setOption('originName', $name);
  172. $this->setOption('tmpFileName ', $tmp_name);
  173. $arrStr=explode('.', $name);
  174. $this->setOption('fileType', strtolower($arrStr[count($ arrStr)-1])) ;
  175. $this->setOption('fileSize', $size);
  176. return true;
  177. }
  178. //用於取得上傳後檔案的檔案名稱
  179. function NewFileName(){getNewFileName(){
  180. return $this->newFileName;
  181. }
  182. / 上傳如果失敗,則呼叫這個方法,就可以查看錯誤報告
  183. function getErrorMsg() {
  184. return $this->errorMess;
  185. }
  186. }
複製程式碼
安裝好,上傳文件,php

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板