文件的上传

和文件上传相关的PHP配置项(php.ini):

  file_uploads=on

  upload_tmp_dir=上传文件保存的临时目录

  upload_max_filesize=2M  上传文件最大的大小

  max_file_uploads=20  允许一次最多上传多少个文件

  post_max_size=8M  表单POST方式发送数据允许的最大值

【单文件上传】

准备工作:

  1.客户端浏览器,在HTML中添加表单页面,添加一个浏览框

    <form action="doAction.php" method="post" enctype="multipart/form-data">

      <input type="file" name="myfile"/>

      <input type="submit" value="上传"/>

      //可在客户端利用隐藏域来限制可上传文件的大小,1024字节=1kb

      //但该限制可以通过浏览器源代码直接修改限制数值后即破解,再点击上传即不受限

      //<input type="hidden" name="MAX_FILE_SIZE" value="1024" />

    </form>

    上传文件原理:将客户端文件通过浏览器上传到服务器端

    注意:表单一定要使用POST方式提交,表单必须添加属性enctype="multipart/form-data"

  2.服务器端配置

    上传至服务器端的文件的信息默认保存在系统预定义变量 $_FILES 中:

      $_FILES['客户端浏览框的名称']['name']:上传文件的名称

      $_FILES['客户端浏览框的名称']['type']:上传文件的MIME类型

      $_FILES['客户端浏览框的名称']['tmp_name']:保存在服务器端的临时文件名,我们在服务器端处理的都是这个临时文件

      $_FILES['客户端浏览框的名称']['error']:上传文件的错误号:

        0:没有错误,文件上传成功

        1:上传的文件超过了 php.ini 中 upload_max_filesize 限制

        2:上传的文件超过了 HTML 表单中 MAX_FILE_SIZE 的值

          <input type="hidden" name="MAX_FILE_SIZE" value="1024" />  

          可被通过客户端浏览器源代码修改限制值破解

        3:文件只有部分被上传

        4:没有文件被上传

        6:找不到临时文件

        7:文件写入失败,权限问题

        8:由于PHP扩展程序中断了文件上传

      $_FILES['客户端浏览框的名称']['size']:上传文件的大小(字节)

    步骤一:接收上传文件的信息

      $filename=$_FILES["浏览框的名称"]["name"];

      $type=$_FILES["浏览框的名称"]["type"];

      $tmp_name=$_FILES["浏览框的名称"]["tmp_name"];

      $error=$_FILES["浏览框的名称"]["error"];

      $size=$_FILES["浏览框的名称"]["size"];

    步骤二:判断错误号是否为0

      if($error!==0){

        switch($error){

          case 1:

            exit("上传的文件超过了php.ini中upload_max_filesize限制");

            break;

          case 2:

            exit("上传的文件超过了HTML表单中MAX_FILE_SIZE的值");

            break;

          case 3:

            exit("文件只有部分被上传");

            break;

          case 4:

            exit("没有文件被上传");

            break;

          case 6:

            exit("找不到临时文件");

            break;

          case 7:

            exit("文件写入失败");

            break;

          case 8:

            exit("由于PHP扩展程序中断了文件上传");

            break;

        }

      }

    步骤三:判断文件大小、MIME类型、扩展名

      if($size>2*1024*1024){

        exit("上传的文件超过了规定的2M");

      }

      //要查看服务器允许的MIME类型:Apache/conf/mime.types文件中查看

      $allow_mime=array('image/png','image/jpeg','image/gif');

      if(!in_array($type,$allow_mime)){

        exit("上传的文件类型不被允许");

      }

      $extname=pathinfo($filename,PATHINFO_EXTENSION);

    步骤四:新建目录

      $dir="./uploads/".date("Y/m/d");

      if(!file_exists($dir)){

        mkdir($dir,0777,true);

      }

    步骤五:新建文件名

      $newfilename=md5(time().mt_rand()).".".$extname;

    步骤六:文件移动

      move_uploaded_file($tmp_name ,$dest)  将服务器上的临时文件移动到指定目录中并给出其文件名

        注意:该文件必须是用过 HTTP POST 方式上传的文件

      is_uploaded_file($tmp_name)  判断文件是否通过 HTPP POST 上传的

      if(is_uploaded_file($tmp_name)){

        if(move_uploaded_file($tmp_name,$dir.'/'.$newfilename)){

          echo "文件上传成功";

          //如有需要,则将文件信息保存下来

          $info=array(
            'orgfilename'=>$filename,
            'newfilename'=>$newfilename,
            'extname'=>$extname,
            'size'=>$size,
            'mime'=>$type
          );

          echo "<pre>";

          var_dump($info);

          echo "</pre>";

        }

      }

【多文件上传】

准备工作:

  1.客户端浏览器,在HTML中添加表单页面,添加多个浏览框

    <form action="doAction.php" method="post" enctype="multipart/form-data">
        file1:<input type="file" name="myfile[]"/><br>
        file2:<input type="file" name="myfile[]"/><br>
        file3:<input type="file" name="myfile[]"/><br>
        file4:<input type="file" name="myfile[]"/><br>
        <input type="submit" value="上传"/>
    </form>
    上传文件原理:将客户端文件以数组形式通过浏览器上传到服务器端
    注意:表单一定要使用POST方式提交,表单必须添加属性enctype="multipart/form-data"

  2.服务器端配置

    上传多文件时,$_FILES数组的结构形式为:

     array(1) {
              ["myfile"]=>
              array(5) {
                  ["name"]=>
                  array(4) {
                    [0]=>
                    string(18) "icon1.png"
                    [1]=>
                    string(18) "icon2.png"
                    [2]=>
                    string(18) "icon3.png"
                    [3]=>
                    string(18) "icon4.png"
                  }
                  ["type"]=>
                  array(4) {
                    [0]=>
                    string(9) "image/png"
                    [1]=>
                    string(9) "image/png"
                    [2]=>
                    string(9) "image/png"
                    [3]=>
                    string(9) "image/png"
                  }
                  ["tmp_name"]=>
                  array(4) {
                    [0]=>
                    string(27) "C:WindowsTempphpA04F.tmp"
                    [1]=>
                    string(27) "C:WindowsTempphpA050.tmp"
                    [2]=>
                    string(27) "C:WindowsTempphpA051.tmp"
                    [3]=>
                    string(27) "C:WindowsTempphpA052.tmp"
                  }
                  ["error"]=>
                  array(4) {
                    [0]=>
                    int(0)
                    [1]=>
                    int(0)
                    [2]=>
                    int(0)
                    [3]=>
                    int(0)
                  }
                  ["size"]=>
                  array(4) {
                    [0]=>
                    int(1815)
                    [1]=>
                    int(1502)
                    [2]=>
                    int(3953)
                    [3]=>
                    int(2435)
                  }
              }
          }

    为了方便之后对每一个上传文件的依次处理,须将$_FILES数组的形式改为:

      array(1) {
                ["myfile"]=>
                array(4) {
                    [0]=>
                    array(5) {
                      ["name"]=>
                      string(18) "icon1.png"
                      ["type"]=>
                      string(9) "image/png"
                      ["tmp_name"]=>
                      string(27) "C:WindowsTempphpA04F.tmp"
                      ["error"]=>
                      int(0)
                      ["size"]=>
                      int(1815)
                    }
                    [1]=>
                    array(5) {
                      ["name"]=>
                      string(18) "icon2.png"
                      ["type"]=>
                      string(9) "image/png"
                      ["tmp_name"]=>
                      string(27) "C:WindowsTempphpA050.tmp"
                      ["error"]=>
                      int(0)
                      ["size"]=>
                      int(1502)
                    }
                    [2]=>
                    array(5) {
                      ["name"]=>
                      string(18) "icon3.png"
                      ["type"]=>
                      string(9) "image/png"
                      ["tmp_name"]=>
                      string(27) "C:WindowsTempphpA051.tmp"
                      ["error"]=>
                      int(0)
                      ["size"]=>
                      int(3953)
                    }
                    [3]=>
                    array(5) {
                      ["name"]=>
                      string(18) "icon4.png"
                      ["type"]=>
                      string(9) "image/png"
                      ["tmp_name"]=>
                      string(27) "C:WindowsTempphpA052.tmp"
                      ["error"]=>
                      int(0)
                      ["size"]=>
                      int(2435)
                    }
                }
            }

    步骤一:重组接收到的上传文件的信息$_FILES数组

      $getFiles=array();

      foreach ($_FILES["浏览框的名称"] as $key01 => $val01) {

        foreach ($val01 as $key02 => $val02) {

          $getFiles["浏览框的名称"][$key02][$key01]=$val02;

        }

      }

    步骤二:遍历重组后的数组数据,依次对每一个上传文件进行处理

         $info=array();  //用于返回处理结果
         $allow_mime=array('image/png','image/jpeg','image/gif','image/wbmp');
         //新建目录
         $dir="./uploads/".date("Y/m/d");

         foreach ($getFiles["浏览框的名称"] as $key => $val) {
             //接收上传文件的信息
             $filename=$val['name'];
             $type=$val['type'];
             $tmp_name=$val['tmp_name'];
             $error=$val['error'];
             $size=$val['size'];

             //判断错误
             if($error!==0){
                 switch ($error) {
                     case 1:
                         $info[$key]['retVal']=false;
                         $info[$key]['info']="上传的文件超过了php.ini中upload_max_filesize限制";
                         break;
                     case 2:
                         $info[$key]['retVal']=false;
                         $info[$key]['info']="上传的文件超过了HTML表单中MAX_FILE_SIZE的值";
                         break;
                     case 3:
                         $info[$key]['retVal']=false;
                         $info[$key]['info']="文件只有部分被上传";
                         break;
                     case 4:
                         $info[$key]['retVal']=false;
                         $info[$key]['info']="没有文件被上传";
                         break;
                     case 6:
                         $info[$key]['retVal']=false;
                         $info[$key]['info']="找不到临时文件";
                         break;
                     case 7:
                         $info[$key]['retVal']=false;
                         $info[$key]['info']="文件写入失败";
                         break;
                     case 8:
                         $info[$key]['retVal']=false;
                         $info[$key]['info']="由于PHP扩展程序中断了文件上传";
                         break;
                 }
                 continue;
             }

             //判断文件大小、mime类型、扩展名
             if($size>2*1024*1024){
                 $info[$key]['retVal']=false;
                 $info[$key]['info']="上传的文件超过了规定的2M";
                 continue;
             }
             if(!in_array($type, $allow_mime)){
                 $info[$key]['retVal']=false;
                 $info[$key]['info']="您上传的文件类型不被允许";
                 continue;
             }

             $extname=pathinfo($filename,PATHINFO_EXTENSION);

             if(!file_exists($dir)){
                 mkdir($dir,0777,true);
             }

             //新建文件名
             $newfilename=md5(time().mt_rand()).".".$extname;

             //文件移动
             if(is_uploaded_file($tmp_name)){
                 if(move_uploaded_file($tmp_name, $dir.'/'.$newfilename)){
                     //保存信息
                     $info[$key]['retVal']=true;
                     $info[$key]['info']=array(
            'orgfilename'=>$filename,
            'newfilename'=>$newfilename,
            'extname'=>$extname,
            'filesize'=>$size,
            'mime'=>$type
          );
                 }
             }
          }

         echo "<pre>";
         var_dump($info);
         echo "</pre>";

原文地址:https://www.cnblogs.com/zhouwanqiu/p/9077440.html