php實現文件上傳與下載(中)

出現不想讓用戶看見的信息,可以使用錯誤抑制符號@;當然能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         // 判斷上傳文件的大小www.2cto.com
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 }

 

You May Also Like