一个非常实用的php文件上传类
author:一佰互联 2019-04-26   click:266

其实网上已经有很多这样的类了,不过出于练手的目的还是自己仿照着写了一个。

下面的代码放在一个名为UploadFile.class.php文件内

<?php  /**   * 文件上传   * author:师少兵   * email :beibeijing163@163.com   * time :2012/12/09   */  class UploadFile{    private $max_size   = "2000000"; //设置上传文件的大小,此为2M    private $rand_name   = true;   //是否采用随机命名    private $allow_type  = array();  //允许上传的文件扩展名    private $error     = 0;     //错误代号    private $msg      = "";    //信息    private $new_name   = "";    //上传后的文件名    private $save_path   = "";    //文件保存路径    private $uploaded   = "";    //路径.文件名    private $file     = "";    //等待上传的文件    private $file_type   = array();  //文件类型    private $file_ext   = "";    //上传文件的扩展名    private $file_name   = "";    //文件原名称    private $file_size   = 0;     //文件大小    private $file_tmp_name = "";    //文件临时名称        /**     * 构造函数,初始化     * @param string $rand_name 是否随机命名     * @param string $save_path 文件保存路径     * @param string $allow_type 允许上传类型        $allow_type可为数组  array("jpg", "jpeg", "png", "gif");        $allow_type可为字符串 "jpg|jpeg|png|gif";中间可用" ", ",", ";", "|"分割     */    public function __construct($rand_name=true, $save_path="./upload/", $allow_type=""){      $this->rand_name = $rand_name;      $this->save_path = $save_path;      $this->allow_type = $this->get_allow_type($allow_type);    }        /**     * 上传文件     * 在上传文件前要做的工作     * (1) 获取文件所有信息     * (2) 判断上传文件是否合法     * (3) 设置文件存放路径     * (4) 是否重命名     * (5) 上传完成     * @param array $file 上传文件     *     $file须包含$file["name"], $file["size"], $file["error"], $file["tmp_name"]     */    public function upload_file($file){      //$this->file   = $file;      $this->file_name   = $file["name"];      $this->file_size   = $file["size"];      $this->error     = $file["error"];      $this->file_tmp_name = $file["tmp_name"];            $this->ext = $this->get_file_type($this->file_name);            switch($this->error){        case 0: $this->msg = ""; break;        case 1: $this->msg = "超出了php.ini中文件大小"; break;        case 2: $this->msg = "超出了MAX_FILE_SIZE的文件大小"; break;        case 3: $this->msg = "文件被部分上传"; break;        case 4: $this->msg = "没有文件上传"; break;        case 5: $this->msg = "文件大小为0"; break;        default: $this->msg = "上传失败"; break;      }      if($this->error==0 && is_uploaded_file($this->file_tmp_name)){        //检测文件类型        if(in_array($this->ext, $this->allow_type)==false){          $this->msg = "文件类型不正确";          return false;        }        //检测文件大小        if($this->file_size > $this->max_size){          $this->msg = "文件过大";          return false;        }      }      $this->set_file_name();      $this->uploaded = $this->save_path.$this->new_name;      if(move_uploaded_file($this->file_tmp_name, $this->uploaded)){        $this->msg = "文件上传成功";        return true;      }else{        $this->msg = "文件上传失败";        return false;      }    }        /**    * 设置上传后的文件名    * 当前的毫秒数和原扩展名为新文件名    */    public function set_file_name(){      if($this->rand_name==true){        $a = explode(" ", microtime());        $t = $a[1].($a[0]*1000000);        $this->new_name = $t.".".($this->ext);      }else{        $this->new_name = $this->file_name;      }    }        /**    * 获取上传文件类型    * @param string $filename 目标文件    * @return string $ext 文件类型    */    public function get_file_type($filename){      $ext = pathinfo($filename, PATHINFO_EXTENSION);      return $ext;    }        /**     * 获取可上传文件的类型     */    public function get_allow_type($allow_type){      $s = array();      if(is_array($allow_type)){        foreach($allow_type as $value){          $s[] = $value;        }      }else{        $s = preg_split("/[s,|;]+/", $allow_type);      }      return $s;    }        //获取错误信息    public function get_msg(){      return $this->msg;    }  }?>

其实上面的代码中还有一个可以改进的地方,就是将那些以‘file_"开头的变量缩写为一个$file数组,这样感觉更好一些。

下面我们来测试一下上面的代码。我在一个名为upfile.php文件写测试代码,同时将UploadFile.class.php放在同一个路径下。

<html><head>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  <title>upfile</title></head><body>  <?php    require "UploadFile.class.php";    if(isset($_POST["sf"]) && $_POST["sf"]=="sf"){      if ($_FILES["file"]["error"] > 0){        echo "Error: " . $_FILES["file"]["error"] . "<br />";      }else{        $file = $_FILES["file"];                $upload = new UploadFile(true, "./images/", array("jpg", "jpeg", "png"));        $upload->upload_file($file);        echo $upload->get_msg();      }    }else{  ?>  <form action="" method="post" enctype="multipart/form-data">    <input type="file" name="file" id="file" />    <input type="hidden" name="sf" value="sf"/>    <input type="submit" value="上传" name="sub" />  </form>  <?php    }  ?></body></html>

在上面的代码中,我们可以尝试修改第15行的参数,用来判断一下我们写的方法是否正确。

这3个参数的含义分别表示:是否使用系统命名、文件存放的路径(相对)、允许上传的文件类型。那么就试试修改这3个参数会发生什么样的变化:(1)把true改为false是否就可以使用它原来的名字了;(2)改下存放路径,看看能不能依然能够上传;(3)试试上传几个不允许的文件,看能不能禁止住,而且关键第三个参数有两种形式,一种是数组,就像示例中一样;还有一种是字符串,用分隔符隔开就行, "jpg|jpeg|png|gif", "jpg jpeg png gif", "jpg,jpeg,png,gif"都行。

好的,文件上传类就这样写好了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持网页设计。