zoukankan      html  css  js  c++  java
  • 文件的上传

    和文件上传相关的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>";

  • 相关阅读:
    天梯赛5-12 愿天下有情人都是失散多年的兄妹 【dfs】
    poj2718 Smallest Difference【贪心】
    HDU problem 5635 LCP Array【思维】
    codeforces 782C Andryusha and Colored Balloons【构造】
    HDU 4278 Faulty Odometer【进制转换】
    codeforces B. The Meeting Place Cannot Be Changed【二分】
    POJ 3264 Balanced Lineup 【线段树】
    HDU 1850
    CodeForces-714C
    HDU Problem 1247 Hat's Words 【字典树】
  • 原文地址:https://www.cnblogs.com/zhouwanqiu/p/9077440.html
Copyright © 2011-2022 走看看