huangcaijin
  PHP代码部分 文件名:upload_file.php
  1 function moreupload_file(array $files){//接收一个预定义变量$_FILES
  2     $fileArr=array();
  3     if(is_array(current($files)[\'name\']))
  4     {
  5         foreach(current($files)[\'name\'] as $key=>$value)
  6         {
  7             $fileArr[$key]=array();
  8             //$fileArr[$key]+=array(\'name\'=>$value);
  9         }
 10         $keys=[\'type\',\'tmp_name\',\'error\',\'size\',\'name\'];
 11         foreach($keys as $values)
 12         {
 13             foreach(current($files)[$values] as $key=>$value)
 14             {
 15                 
 16                 $fileArr[$key]+=array($values=>$value);
 17             }  
 18         }
 19 
 20     }
 21     $files=$fileArr;
 22     $_FILES=$fileArr;
 23     $file_count=0; 
30
 do{ 31 upload_file(strval(key($files))); 32 if(current($files)[\'error\'] == 0) 33 { 34 ++$file_count; 35 } 36 }while(next($files)) 37 return "共".$file_count."个文件上传成功"; 38 } 39 //单文件上传函数 40 function upload_file(string $file,array $allowext=array(\'jpeg\',\'png\',\'txt\',\'gif\',\'html\',\'jpg\',\'zip\',\'rar\'),int $maxsize=1000000000,string $uploadpath=\'./upload\'){ 41 @define(\'UPLOAD_ERRS\',[ 42 \'upload_err_ini_size\'=>"上传文件大小超过服务器允许上传的最大值", 43 \'upload_err_form_size\'=>"上传文件大小超过HTML表单中隐藏域MAX_FILE_SIZE选项指定的值", 44 \'upload_err_partial\'=>"文件只有部分被上传", 45 \'no_upload_file_select\'=>"没有选择文件上传", 46 \'temp_file_none\'=>"服务器临时文件夹丢失", 47 \'upload_err_no_tmp_dir\'=>"服务器临时文件夹丢失", 48 \'upload_err_cant_write\'=>"文件写入失败", 49 \'upload_err_extension\'=>"php上传扩展没有打开", 50 \'no_allow_ext\'=>"不允许该类文件上传", 51 \'upload_err_file_max\'=>"超过文件上传大小", 52 \'no_http_post\'=>"没有使用http协议post方式上传", 53 \'move_err_file\'=>"文件移动失败" 54 55 56 ]); 57 58 $fileinfo=$_FILES[$file]; 59 60 if($fileinfo[\'error\']===UPLOAD_ERR_OK) 61 { 62 63 $ext=strtolower(pathinfo($fileinfo[\'name\'],PATHINFO_EXTENSION)); 64 if(!in_array($ext,$allowext)) 65 { 66 return UPLOAD_ERRS[\'no_allow_ext\']; 67 } 68 if($fileinfo[\'size\']>$maxsize) 69 { 70 return UPLOAD_ERRS[\'upload_err_file_max\']; 71 } 72 if(!is_uploaded_file($fileinfo[\'tmp_name\'])) 73 { 74 return UPLOAD_ERRS[\'no_http_post\']; 75 } 76 if(!is_dir($uploadpath)) 77 { 78 79 mkdir($uploadpath,0777,true); 80 } 81 $dest=$uploadpath."/".md5(time().str_shuffle(\'abcdefghijklmnopquvwxyz1234567890\')).".".$ext; 82 if(@!move_uploaded_file($fileinfo[\'tmp_name\'],$dest)) 83 { 84 return UPLOAD_ERRS[\'move_err_file\']; 85 } 86 return "文件上传成功,文件路径:".$dest.\'<br>\'; 87 } 88 else{ 89 90 switch($fileinfo[\'error\']) 91 { 92 case 1: $msg=UPLOAD_ERRS[\'upload_err_ini_size\']; 93 break; 94 case 2: $msg=UPLOAD_ERRS[\'upload_err_form_size\']; 95 break; 96 case 3: $msg=UPLOAD_ERRS[\'upload_err_partial\']; 97 break; 98 case 4: $msg=UPLOAD_ERRS[\'no_upload_file_select\']; 99 break; 100 case 5: $msg=UPLOAD_ERRS[\'temp_file_none\']; 101 break; 102 case 6: $msg=UPLOAD_ERRS[\'upload_err_no_tmp_dir\']; 103 break; 104 case 7: $msg=UPLOAD_ERRS[\'upload_err_cant_write\']; 105 break; 106 case 8: $msg=UPLOAD_ERRS[\'upload_err_extension\']; 107 break; 108 } 109 return $msg; 110 } 111 112 }
  moreupload_file($_FILES);//调用上面定义的函数

  

  HTML代码部分

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7     <title>Document</title>
 8 </head>
 9 <body>
10     <div id="box"></div>
11     
12     <form action="./upload_file.php" method="post" enctype="multipart/form-data" id="formdata">
13         <input type="file" name="file[]" id="file" multiple="multiplt">

14 <input type="submit" value="文件上传" id="uploadFile">
15     </form>
16     <script type="text/javascript"  src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
17 <script>
18     
19     var fileArr=document.getElementById(\'file\').files;
20     var fileOne=document.getElementById(\'file\');
21     var formOne=null;
22     fileOne.onchange=function(){
23         var fileArr=document.getElementById(\'file\').files;
24         var box=document.getElementById(\'box\');
25         var file;
26         for(file in fileArr)
27         {
28             if(fileArr[file][\'name\'] && !isNaN(file))
29             {
30             box.innerHTML+=\'<img src="\'+window.URL.createObjectURL(fileArr[file])+\'" style="width:200px;">\';
31             
32             }
33         }
34        
35      
36     }
37     
38 
39 </script>
40 </body>
41 </html>
HTML部分效果图:




moreupload_file()函数接收到的$_FILES 数据格式



多个文件上传的数据和单个文件上传进行对比一下。



这一对比就可以看出他们之间的关系,相比单文件接收到的数据,多文件用数组把相同键名的数据存储到了一个数组当中,
再看一下单文件上传函数upload_file()接收到的参数是$_FILES[]的键值,
所以需要对多文件接收到的参数进行处理
moreupload_file()中的代码段
 1 foreach(current($files)[\'name\'] as $key=>$value)
 2         {
 3             $fileArr[$key]=array();//定义一个二维数组$fileArr
 4             //$fileArr[$key]+=array(\'name\'=>$value);
 5         }
 6
 7         $keys=[\'type\',\'tmp_name\',\'error\',\'size\',\'name\'];
 8         foreach($keys as $values)
 9         {
10             foreach(current($files)[$values] as $key=>$value)
11             {
12                 $fileArr[$key]+=array($values=>$value);//将数据处理存入刚才定义的二维数组$fileArr
13             }  
14         }
这个就是上面定义的二维数组$fileArr
这种结构就和我们刚才的单文件上传接收到的数据结构相同了
接下来就只要循环调用单文件上传函数upload_file()就可以了

 

 

 

 

分类:

技术点:

相关文章: