今天一个网站介绍三种多文件上传的方法,前两种都是直接遍历三维超全局数组$_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 | } |