出現不想讓用戶看見的信息,可以使用錯誤抑制符號@;當然能echo的東西都是可以賦值給一個變量的;
定義用戶上傳文件類型,將其放在數組變量allowExt中,用if(!in_array(第一個參數為獲取上傳文件的后綴名,可以使用strtolower函數來判定 點號‘ .’之后的后綴名,或者也可以用自帶擴展函數pathinfo(file的名字,PATHINFO_EXTENSION)來判定,第二個參數就是允許上傳的類型的數組變量allowExt);但是這種情況下,用戶萬一上傳上來一個病毒信息,只是改了后綴名,就要用到getimagesize來獲取圖片的信息,基本信息會有圖片的寬度和高度以及類型,部分還會有channel和bits;如果允許用戶上傳的不僅僅是圖片類型,則使用flag的布爾值進行判定;
還要注意的是用戶上傳的文件的命名,不能存在重名覆蓋現象,可以使用md5(uniqid(microtime(true),true))或類似函數進行判定;
有的時候用戶需要上傳到自己的某個目錄下,則可以用if(!files_exit(path))進行判定,不存在就用mkdir ($path,0777,true)來自定義上傳的路徑;
在各種判定之后,可以將這個文件封裝成一個函數,將下文中會使用到的變量設置為該函數的參數,在調用時可以傳參,在單文件多文件上傳的時候可以直接調用函數即可,大大簡化代碼量;
單文件上傳基本思路也就是:先檢測錯誤信息,一一匹配,用switch……case輸出對應的錯誤信息------》檢測文件上傳的類型是否是自己定義的數組中的某一個-----》檢測上傳文件是否滿足規范中的大小要求----》檢測文件圖片等內容是否是真實的圖片類型等(用flag和getimagesize獲取信息)----》檢測文件是否通過http post方法傳上來的----》定義文件上傳進來的名字和路徑(此時需要檢測路徑是否存在以及同名文件是否存在,采用加密方式重命名)---》上傳成功,返回具體的數組變量或者上傳文件名。
1 <?php 2 header('content-type:text/html;charset=utf-8'); 3 4 function upload($fileInfo,$allowExt = array('jpeg', 'jpg', 'png', 'gif', 'pdf'), $maxSize = 2097152, $path = 'text', $flag = true) 5 { 6 $fileInfo = $_FILES['file1']; 7 // $maxSize = 2097152; // 允許上傳的最大字節數2M 8 // $flag = true; // 檢測是否真實類型 9 // 允許上傳的文件類型,直接放在參數里了 10 // $allowExt = array( 11 // 'jpeg', 12 // 'png', 13 // 'png', 14 // 'gif', 15 // 'pdf' 16 // ); 17 if(!is_array($allowExt)){ 18 exit('系統錯誤'); 19 } 20 // 1、判斷錯誤號 21 if ($fileInfo['error'] == 0) { 22 // 判斷上傳文件的大小 23 if ($fileInfo['size'] > $maxSize) { 24 exit('上傳文件過大'); 25 } 26 // 判斷文件類型:兩種方法--使用截取后綴名或者用自帶擴展名的判定來判定 27 $ext = pathinfo($fileInfo['name'], PATHINFO_EXTENSION); 28 $ext = strtolower(end(explode('.', $fileInfo['name']))); 29 if (! in_array($ext, $allowExt)) { 30 exit('非法文件類型'); 31 } 32 // 判斷文件是否通過http post方式穿上的 33 if (! is_uploaded_file($fileInfo['tmp_name'])) { 34 exit('文件不是通過http post方法傳上來的'); 35 } 36 if ($flag) { 37 if (! getimagesize($fileInfo['tmp_name'])) { 38 exit('不是真正的圖片類型'); 39 } 40 } 41 // 上傳文件,先判定路徑是否存在,如果不存在則建立 42 // $path = 'text'; 43 if (! file_exists($path)) { 44 mkdir($path, 0777, true); 45 chmod($path, 0777); 46 } 47 48 // 要確保文件名唯一,防止重名產生覆蓋,使用加密函數md5,mcrotime表示微秒數,兩個參數則為true; 49 $uniName = md5(uniqid(microtime(true), true)) . '.' . $ext; 50 // 測試是否可以加密輸出 echo $uniName; 51 // exit(); 52 $destination = $path . '/' . $uniName; 53 if (move_uploaded_file($fileInfo['tmp_name'], $destination)) { 54 // echo '上傳成功';可以不僅僅是顯示返回成功,可以返回文件的信息內容等 55 // return array( 56 // 'newName' => $destination, 57 // 'size' => $fileInfo['size'], 58 // 'type' => $fileInfo['type'] 59 // ); 60 return $destination; 61 //如果只要一個文件名,則return $destination即可 62 } else { 63 echo '上傳失敗'; 64 } 65 } else { 66 // 匹配錯誤信息,與err號應該一一對應的 67 switch ($fileInfo['error']) { 68 case 1: 69 $remindMes= '上傳文件超過了php配置文件中upload_max_filesize選項的值'; 70 break; 71 case 2: 72 $remindMes= '上傳文件超過了表單max_file_size選項的值'; 73 break; 74 case 3: 75 $remindMes= '文件部分被上傳'; 76 break; 77 case 4: 78 $remindMes= '沒有選擇上傳文件'; 79 break; 80 case 6: 81 $remindMes= '沒有找到臨時目錄'; 82 break; 83 case 7: 84 85 case 8: 86 $remindMes= '系統錯誤'; 87 break; 88 } 89 exit($remindMes); 90 } 91 }
也是參考了別人的指點的,哦呵呵,又練練手啦……