使用php实现文件上传和多文件上传

在PHP程序开发中,文件上传是一个使用非常普遍的功能。但在网页上实现文件上传存在着一定的“危险性”,例如:某些恶意的用户欺骗脚本去访问本不能访问的文件,或者借此上传一些bug或病毒,因此,在目前的网络平台上,文件上传这个功能虽使用非常普遍但存在限制性。

  首先,我们得了解$_FILES系统函数:  

    $_FILES['myFile']['name']   客户端文件的原名称。

    $_FILES['myFile']['type']   文件的 MIME 类型,例如"image/gif"。

    $_FILES['myFile']['size']   已上传文件的大小,单位为字节。

    $_FILES['myFile']['tmp_name']   储存的临时文件名,一般是系统默认。

    $_FILES['myFile']['error']   该文件上传相关的错误代码。

    拓展:

       错误代码:
         0:文件上传成功。
      1:超过了文件大小php.ini中。
     2:超过了文件大小MAX_FILE_SIZE 选项指定的值。
     3:文件只有部分被上传。
     4:没有文件被上传。
     5:上传文件大小为0
   所以:只有$_FILES['myFile']['error']>0时文件才上传成功,其他都是不成功

  接着,我们编写一个index.php文件,实现用户上传界面。详细代码如下:
 1 <?php
 2 
 3 //设置字符编码为utf-8,避免中文乱码
 4 header("content-type:text/html;charset=utf-8");
 5 
 6 ?>
 7 
 8 <form name="form1" action="rec.php" method="post" enctype="multipart/form-data">
9  文件:<input type="file" name="upfile[]"><br/> 10 <input type="submit" name="submit" value="上传文件"> 11 </form>  
注意:
   默认情况,表单中编码格式是enctype="application/x-www-form-urlencoded",不能用于文件上传,只能用于提交一般的表单请求;如果提交的表单中包含需要上传的文件,则需使用enctype="multipart/form-data"实现文件上传功能。此外,method的属性值必须为post。

  表单创建后,我们需对用户所上传的文件的进行判断并接受,因此,我们需写一个receive.php。详细代码如下:
 1 <?php
 2   //设置字符编码为utf-8,避免乱码
 3   header("content-type:text/html;charset=utf-8");
 4   
 5   //如果上传的文件名称中包含中文,可能引起文件名称乱码问题。此时,可使用函数iconv()来转换文件名称的编码
 6  
 7   if(isset($_POST['submit'])){
 8       //判断文件上传过程中是否发生错误 0为正确,1-5均有错误发生
 9      if($_FILES['upfile']['error']>0){
10          echo "<script>alert('没有选择文件!');window.location.href='index.php';</script>";
11      }
12  
13      //定义允许上传的文件类型和文件大小
14      $ext_arr=array("pjpeg","jpeg","jpg","png","gif","bmp");
15      $size=102400;  //100kb
16  
17      //定义上传文件的存放目录,不存在则建立
18      $upload="upload";
19      if(!is_dir($upload)){
20          mkdir($upload,0777,true);   //0777:可读可写可执行
21      }
22  
23     //判断上传文件的类型是否符合规定的模式类型
24      $arr_name=explode('.',strtolower($_FILES['upfile']['name']));
25      //取出文件的扩展名
26      $extent = array_pop($arr_name);
27      if(!in_array($extent,$ext_arr)){
28          echo "<script>alert('上传文件类型不正确!');window.location.href='index.php';</script>";
29         
30      }
31  
32      //判断上传文件的大小
33      if($_FILES['upfile']['size']>$size){
34          echo "<script>alert('文件大小超出100kb!');window.location.href='index.php';</script>";
35      }
36  
37      //修改上传文件的文件名 =>加密
38      $newFileName = md5(mt_rand(100,999999)).'.'.$extent;
39 
40      //在PHP中,当浏览器客户端提交过来的表单请求中包含上传的文件时,PHP会将上传的文件先暂时存放在临时目录中,执行文件上传。
41      if(is_uploaded_file($_FILES['upfile']['tmp_name'])){
42          if(move_uploaded_file($_FILES['upfile']['tmp_name'],$upload.'/'.$newFileName)){
43              echo "文件上传成功!,<a href=".$upload."/".$newFileName.">查看</a>";
44          }else{
45              echo "文件上传失败!";
46          }
47      }
48  }
49  
50  ?>
须知:1)is_uploaded_file检查tmp中是否有对应的临时文件,判断文件是否通过http post上传的,该函数可以用于确保恶意的用户无法欺骗脚本去访问本不能访问的文件。             2)move_uploaded_file(临时文件,目标位置和文件名):把临时文件移到目标位置,成功返回true,否则返回false

二、实现多文件上传
  原理:与单个文件上传大同小异,用for循环实现多个文件的判断和上传
  首先,编写一个index.php文件,实现用户多文件上传界面。详细代码如下:
 1 <?php
 2 
 3 //设置字符编码为utf-8,避免中文乱码
 4 header("content-type:text/html;charset=utf-8");
 5 
 6 ?>
 7 
 8 <form name="form1" action="multi_rec.php" method="post" enctype="multipart/form-data">
 9     文件1:<input type="file" name="upfile[]"><br/>
10     文件2:<input type="file" name="upfile[]"><br/>
11     文件3:<input type="file" name="upfile[]"><br/>
12     <input type="submit" name="submit" value="上传文件">
13 </form>

  接着,创建multi_recevie.php文件,实现对多文件的判断和上传

 2 //设置字符编码为utf-8,避免乱码
 3 header("content-type:text/html;charset=utf-8");
 4 
 5 if(isset($_POST['submit'])){
 6     //文件夹创建
 7     $upload='upload';
 8     if(!is_dir($upload)){
 9         mkdir($upload,0777,true);
10     }
11 
12     //定义规定的文件类型和大小
13     $ext_arr=array("pjpeg","jpeg","jpg","png","gif","bmp");
14     $size=102400;
15     for($i=0;$i<count($_FILES['upfile']['name']);$i++){
16 
17         //判断上传文件是否为空,若为空则跳出本次循环
18         if($_FILES['upfile']['name'][$i]==""){
19             continue;
20         }
21 
22         //取出文件扩展名
23         $arr_name=explode('.',$_FILES['upfile']['name'][$i]);
24         $extend=array_pop($arr_name);
25 
26         //判断文件类型是否符合
27         if(!in_array($extend,$ext_arr)){
28             echo $_FILES['upfile']['name'][$i]."上传文件类型不正确!<br/>";
29         }
30 
31         //判断文件大小
32         if($_FILES['upfile']['size'][$i]>$size){
33             echo $_FILES['upfile']['size'][$i]."上传文件大小超过100kb!<br/>";
34         }
35 
36         //新建文件名
37         $newFileName=md5(mt_rand(100,999999)).'.'.$extend;
38 
39         //判断临时文件是否存在,上传的是临时文件,把临时文件转到目标文件夹
40         if(is_uploaded_file($_FILES['upfile']['tmp_name'][$i])){
41             if(move_uploaded_file($_FILES['upfile']['tmp_name'][$i],$upload.'/'.$newFileName)){
42                 echo "文件上传成功!<br/>";
43             }
44         }
45     }
46 }

ps:此文章为本人上课笔记加个人理解所归纳的,若有不妥处,请各大神指教!

posted @ 2016-06-06 16:55  Yolanda_Phang  阅读(213)  评论(0)    收藏  举报