今天一個網站介紹三種多文件上傳的方法,前兩種都是直接遍歷三維超全局數組$_FILES,最後一種是先定義一個單文件上傳函數,再循環調用該函數,完成多文件的上傳。
方法一:當多文件上傳表單中多個上傳文件的name屬性爲“pic[]”形式時,也即表單爲這種形式。
HTML代碼:
1 |
< form action = "" method = "post" enctype = "multipart/form-data" > |
2 |
< input type = "hidden" name = "MAX_FILE_SIZE" value = "" > |
3 |
< input type = "file" name = "pic[]" />< br >< br > |
4 |
< input type = "file" name = "pic[]" />< br >< br > |
5 |
< input type = "file" name = "pic[]" />< br >< br > |
6 |
< input type = "file" name = "pic[]" />< br >< br > |
7 |
< input type = "submit" value = "upload" /> |
8 |
</ form > |
01 |
<?php |
02 |
//1.獲取要上傳文件的信息 |
03 |
$up_info = $_FILES [ 'pic' ]; |
04 |
05 |
$ob_path = "../system" ; |
06 |
07 |
$typelist = array ( "image/gif" , "image/jpeg" , "image/pjpeg" , "image/png" ); //定義運行的上傳文件類型 |
08 |
09 |
10 |
for ( $i =0; $i < count ( $up_info [ 'name' ]); $i ++){ //foreach
循環處理多個文件上傳 |
11 |
//2.判斷文件是否上傳錯誤 |
12 |
13 |
if ( $up_info [ 'error' ][ $i ]>0){ |
14 |
switch ( $up_info [ 'error' ][ $i ]){ |
15 |
case 1: |
16 |
$err_info = "上傳的文件超過了
php.ini 中 upload_max_filesize 選項限制的值" ; |
17 |
break ; |
18 |
case 2: |
19 |
$err_info = "上傳文件的大小超過了
HTML 表單中 MAX_FILE_SIZE 選項指定的值" ; |
20 |
break ; |
21 |
case 3: |
22 |
$err_info = "文件只有部分被上傳" ; |
23 |
break ; |
24 |
case 4: |
25 |
$err_info = "沒有文件被上傳" ; |
26 |
break ; |
27 |
case 6: |
28 |
$err_info = "找不到臨時文件夾" ; |
29 |
break ; |
30 |
case 7: |
31 |
$err_info = "文件寫入失敗" ; |
32 |
break ; |
33 |
default : |
34 |
$err_info = "未知的上傳錯誤" ; |
35 |
break ; |
36 |
} |
37 |
continue ( $err_info ); |
38 |
} |
39 |
40 |
41 |
//3.判斷文件上傳的類型是否合法 |
42 |
43 |
if (!in_array( $up_info [ 'type' ][ $i ], $typelist )){ |
44 |
continue ( '文件類型錯誤!' . $up_info [ 'type' ][ $i ]); |
45 |
} |
46 |
47 |
//4.上傳文件的大小過濾 |
48 |
49 |
if ( $up_info [ 'size' ][ $i ]>1000000){ |
50 |
continue ( '文件大小超過1000000' ); |
51 |
} |
52 |
53 |
54 |
//5.上傳文件名處理 |
55 |
56 |
$exten_name = pathinfo ( $up_info [ 'name' ][ $i ],PATHINFO_EXTENSION); |
57 |
58 |
do { |
59 |
$main_name = date ( 'YmHis' . '--' .rand(100,999)); |
60 |
$new_name = $main_name . '.' . $exten_name ; |
61 |
} while ( file_exists ( $to_path . '/' . $new_name )); |
62 |
63 |
64 |
65 |
//6.判斷是否是上傳的文件,並執行上傳 |
66 |
67 |
if ( is_uploaded_file ( $up_info [ 'tmp_name' ][ $i ])){ |
68 |
69 |
if (move_uploaded_file( $up_info [ 'tmp_name' ][ $i ], $ob_path . '/' . $new_name )){ |
70 |
echo '文件上傳成功!' ; |
71 |
} else { |
72 |
echo '上傳文件移動失敗!' ; |
73 |
} |
74 |
} else { |
75 |
echo '文件不是上傳的文件' ; |
76 |
} |
77 |
78 |
} //for循環的括號 |
也即表單爲這種形式:
1 |
< form action = "" method = "post" enctype = "multipart/form-data" > |
2 |
< input type = "hidden" name = "MAX_FILE_SIZE" value = "" > |
3 |
< input type = "file" name = "pic" />< br >< br > |
4 |
< input type = "file" name = "text" />< br >< br > |
5 |
< input type = "file" name = "doc" />< br >< br > |
6 |
< input type = "file" name = "pdf" />< br >< br > |
7 |
8 |
< input type = "submit" value = "upload" /> |
9 |
</ form > |
01 |
//1.獲取要上傳文件的信息 |
02 |
$up_info = $_FILES ; |
03 |
04 |
$ob_path = "..\system" ; |
05 |
06 |
$typelist = array ( "image/gif" , "image/jpeg" , "image/pjpeg" , "image/png" ); //定義運行的上傳文件類型 |
07 |
08 |
09 |
10 |
foreach ( $up_info as $k_name => $value ){ //用foreach循環
處理多個文件的上傳 |
11 |
//2.判斷文件是否上傳錯誤 |
12 |
13 |
if ( $up_info [ $k_name ][ 'error' ]>0){ |
14 |
switch ( $up_info [ 'error' ][ $i ]){ |
15 |
case 1: |
16 |
$err_info = "上傳的文件超過了
php.ini 中 upload_max_filesize 選項限制的值" ; |
17 |
break ; |
18 |
case 2: |
19 |
$err_info = "上傳文件的大小超過了
HTML 表單中 MAX_FILE_SIZE 選項指定的值" ; |
20 |
break ; |
21 |
case 3: |
22 |
$err_info = "文件只有部分被上傳" ; |
23 |
break ; |
24 |
case 4: |
25 |
$err_info = "沒有文件被上傳" ; |
26 |
break ; |
27 |
case 6: |
28 |
$err_info = "找不到臨時文件夾" ; |
29 |
break ; |
30 |
case 7: |
31 |
$err_info = "文件寫入失敗" ; |
32 |
break ; |
33 |
default : |
34 |
$err_info = "未知的上傳錯誤" ; |
35 |
break ; |
36 |
} |
37 |
continue ( $err_info ); |
38 |
} |
39 |
40 |
41 |
//3.判斷文件上傳的類型是否合法 |
42 |
43 |
if (!in_array( $up_info [ $k_name ][ 'type' ], $typelist )){ |
44 |
continue ( '文件類型錯誤!' . $up_info [ $k_name ][ 'type' ]); |
45 |
} |
46 |
47 |
//4.上傳文件的大小過濾 |
48 |
49 |
if ( $up_info [ $k_name ][ 'size' ]>100000){ |
50 |
echo '文件大小超過**' ; |
51 |
continue ; |
52 |
} |
53 |
54 |
55 |
//5.上傳文件名處理 |
56 |
57 |
$exten_name = pathinfo ( $up_info [ $k_name ][ 'name' ],PATHINFO_EXTENSION); |
58 |
59 |
do { |
60 |
$main_name = date ( 'YmHis' . '--' .rand(100,999)); |
61 |
$new_name = $main_name . '.' . $exten_name ; |
62 |
} while ( file_exists ( $to_path . '/' . $new_name )); |
63 |
64 |
65 |
//6.判斷是否是上傳的文件,並執行上傳 |
66 |
67 |
if ( is_uploaded_file ( $up_info [ $k_name ][ 'tmp_name' ])){ |
68 |
69 |
if (move_uploaded_file( $up_info [ $k_name ][ 'tmp_name' ], $ob_path . '/' . $new_name )){ |
70 |
echo '文件上傳成功!' ; |
71 |
} else { |
72 |
echo '上傳文件移動失敗!' ; |
73 |
} |
74 |
} else { |
75 |
echo '文件不是上傳的文件' ; |
76 |
} |
77 |
78 |
} //for循環的括號 |
方法三:先定義單個文件上傳的函數,再循環調用這個函數,每次傳入一個文件的上傳信息,也可以到達多文件上傳的目的,而且這種方式,更容易理解。
1 |
< form action = "" method = "post" enctype = "multipart/form-data" > |
2 |
< input type = "hidden" name = "MAX_FILE_SIZE" value = "" > |
3 |
< input type = "file" name = "pic1" >< br > |
4 |
< input type = "file" name = "pic2" >< br > |
5 |
< input type = "file" name = "pic3" >< br > |
6 |
< input type = "submit" value = "upload" > |
7 |
</ form > |
001 |
/* |
002 |
*單文件上傳函數 |
003 |
*@param
array $up_info 記錄上傳文件信息的超全局數組 |
004 |
*@param
string $to_path 上傳文件的目標路徑 |
005 |
*@param
array $typlist 允許的文件類型 |
006 |
*@param
int $file_size允許的文件大小 |
007 |
*@return
string 上傳失敗,返回失敗的原因, |
008 |
* http://yige.org/php/ |
009 |
*
成功返回包括文件名的路徑。 |
010 |
*/ |
011 |
012 |
013 |
function upload_fun( $up_info , $to_path , $typelist = array (), $file_size =2000000){ |
014 |
015 |
//1.判斷文件上傳是否錯誤 |
016 |
017 |
if ( $up_file [ 'error' ]>0){ |
018 |
switch ( $up_info [ 'error' ]){ |
019 |
case 1: |
020 |
$err_info = "上傳的文件超過了
php.ini 中 upload_max_filesize 選項限制的值" ; |
021 |
break ; |
022 |
case 2: |
023 |
$err_info = "上傳文件的大小超過了
HTML 表單中 MAX_FILE_SIZE 選項指定的值" ; |
024 |
break ; |
025 |
case 3: |
026 |
$err_info = "文件只有部分被上傳" ; |
027 |
break ; |
028 |
case 4: |
029 |
$err_info = "沒有文件被上傳" ; |
030 |
break ; |
031 |
case 6: |
032 |
$err_info = "找不到臨時文件夾" ; |
033 |
break ; |
034 |
case 7: |
035 |
$err_info = "文件寫入失敗" ; |
036 |
break ; |
037 |
default : |
038 |
$err_info = "未知的上傳錯誤" ; |
039 |
break ; |
040 |
} |
041 |
042 |
return $err_info ; |
043 |
die (); |
044 |
} |
045 |
046 |
047 |
//2.判斷上傳文件類型是否合法 |
048 |
049 |
if ( count ( $typelist )>0){ |
050 |
if (!in_array( $up_info [ 'type' ], $typelist )){ |
051 |
052 |
$err_info = '文件類型不合法!' . $up_info [ 'type' ]; |
053 |
return $err_info ; |
054 |
die (); |
055 |
} |
056 |
} |
057 |
058 |
//4.判斷上傳文件大小是否超出允許值 |
059 |
060 |
if ( $up_info [ 'size' ]> $file_size ){ |
061 |
062 |
return $err_info = '文件大小超過' . $file_size ; |
063 |
die (); |
064 |
} |
065 |
066 |
//5.上傳文件重命名 |
067 |
068 |
$exten_name = pathinfo ( $up_info [ 'name' ],PATHINFO_EXTENSION); |
069 |
070 |
do { |
071 |
$main_name = date ( 'YmHis' . '--' .rand(100,999)); |
072 |
$new_name = $main_name . '.' . $exten_name ; |
073 |
} while ( file_exists ( $to_path . '/' . $new_name )); |
074 |
075 |
//6.判斷是否是上傳的文件,並移動文件 |
076 |
077 |
if ( is_uploaded_file ( $up_info [ 'tmp_name' ])){ |
078 |
079 |
if (move_uploaded_file( $up_info [ 'tmp_name' ], $to_path . '/' . $new_name )){ |
080 |
081 |
$err_info = $to_path . '/' . $new_name ; |
082 |
return $err_info ; |
083 |
die (); |
084 |
} else { |
085 |
086 |
return $err_info = '上傳文件移動失敗!' ; |
087 |
die (); |
088 |
089 |
} |
090 |
} else { |
091 |
092 |
return $err_info = '這個文件不是上傳文件!' ; |
093 |
die (); |
094 |
} |
095 |
096 |
} |
097 |
098 |
//函數使用方法如下 |
099 |
100 |
$multi_info = $_FILES ; //接收$_FILES的全部上傳信息 |
101 |
102 |
$to_path = 'system' ; //上傳文件的目標路徑 |
103 |
104 |
foreach ( $multi_info as $name => $up_info ){ //foreach
遍歷$multi_info |
105 |
106 |
$err_info =upload_fun( $up_info , $to_path ); //調用單文件上傳函數 |
107 |
108 |
p( $err_info ); //輸出返回信息; |
109 |
110 |
} |