PHP多文件上传的三种方法

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

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循环的括号
方法二:当多文件上传表单中多个上传文件的name属性为“pic,text,doc,pdf”形式时

也即表单为这种形式:

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 上传失败,返回失败的原因,
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 }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值