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>";

  • 相关阅读:
    django 之 用户忘记密码的解决办法
    Django 富文本ckeditor 在模板中的实现
    MySQL密码的恢复方法
    sublime 快捷键
    linux 修改用户密码
    ubuntu 下重启 mysql
    python 控制浏览器模块
    读书笔记:从小工到专家(一)
    urlparse 模块
    python 标准内建函数
  • 原文地址:https://www.cnblogs.com/zhouwanqiu/p/9077440.html
Copyright © 2011-2022 走看看