非常经典的PHP文件上传类分享

文件上传

是项目开发中比较常见的功能,但文件上传的过程比较繁琐,只要是有文件上传的地方就需要编写这些复杂的代码。为了能在每次开发中降低功能的编写难度,也为了能节省开发时间,通常我们都会将这些反复使用的一段代码封装到一个类中。

rush:PHP;"> private $filepath; //保存路径
private $allowtype=array('gif','jpg','jpeg','png','txt');
private $maxsize=1000000; //最大允许上传大小
private $israndname=true; //是否随机
private $orginame; //原始文件名
private $tmpname; //临时文件名
private $newname; //新文件名
private $filetype; //文件类型
private $filesize; //文件大小
private $errornum=''; //错误号
private $errormsg; //错误信息
/*
+------------------------------------------------------------------------------
构造函数
+------------------------------------------------------------------------------

  • @param string $savepath 保存路径

  • @param string $allowtype 允许类型

  • @param string $maxsize 允许大小

  • +------------------------------------------------------------------------------
    */
    function __construct($option=array()){
    foreach ($option as $key=>$value){

    if (!in_array($key,get_class_vars(get_class($this)))){
    continue;
    }
    $this->setoption($key,$value);
    }
    }
    function uploadfile($field) {
    $return=true;
    if (!$this->CheckPath()) {
    $this->errormsg=$this->geterrorNum();
    return false;
    }
    $name=$_FILES[$field]['name'];
    $tmpname=$_FILES[$field]['tmp_name'];
    $filesize=$_FILES[$field]['size'];
    $error=$_FILES[$field]['error'];
    if (is_array($name)) {
    $errors=array();
    for ($i=0;$i<count($name);$i++){
    if ($this->getFile($name[$i],$tmpname[$i],$filesize[$i],$errors[$i])) {
    if (!$this->CheckSize() && !$this->CheckType()) {
    $errors=$this->getErrorNum();
    return false;
    }
    }else{
    $errors=$this->getErrorNum();
    return false;
    }
    if (!$return) {
    $this->getFile();
    }
    }
    if ($return) {
    $fileNames=array();
    for ($i=0;$i<count($name);$i++){
    if ($this->getFile($name[$i],$filesize[$i])) {
    $this->SetFileName();
    if (!$this->MoveFile()) {
    $errors[]=$this->getErrorNum();
    $return=false;
    }else{
    $fileNames[]=$this->getNewName();
    }
    }
    }
    $this->newname=$fileNames;
    }
    $this->errormsg=$errors;
    return $return;

    }else{
    if($this->getFile($name,$tmpname,filesize,$error)){
    if(!$this->CheckSize()){
    return false;
    }
    if(!$this->CheckType()){
    return false;
    }
    $this->SetFileName();
    if ($this->MoveFile()) {
    return true;
    }
    }else{
    return false;
    }

    if (!$return) {
    $this->setoption('ErrorNum',0);
    $this->errormsg=$this->geterrorNum();
    }
    return $return;
    }
    }
    /*
    +------------------------------------------------------------------------
    设置类属性函数
    +------------------------------------------------------------------------

    • @param mix $key
    • @param mix $value
      */
      private function setoption($key,$value){
      $key=strtolower($key);
      $this->$key=$value;
      }
      /**
      +---------------------------------------------------------------------------
    • 获取文件变量参数函数
      +---------------------------------------------------------------------------
    • @param string $name
    • @param string $tmp_name
    • @param number $size
    • @param number $error
      */
      private function getFile($name,$filetype,$filesize,$error=0){

    $this->setoption('TmpName',$tmpname);
    $this->setoption('OrgiName',$name);
    $arrstr=explode('.',$name);
    $this->setoption('FileType',$arrstr[count($arrstr)-1]);
    $this->setoption('FileSize',$filesize);
    return true;
    }
    /**
    +-------------------------------------------------------------------------

    • 检查上传路径函数
      +-------------------------------------------------------------------------
    • @return boolean
      */
      private function CheckPath(){
      if(empty($this->filepath)){
      $this->setoption('ErrorNum',-5);
      return false;
      }
      if (!file_exists($this->filepath)||!is_writable($this->filepath)) {
      if (!@mkdir($this->filepath,0755)) {
      $this->setoption('ErrorNum',-4);
      return false;
      }
      }
      return true;
      }
      private function Is_Http_Post(){
      if (!is_uploaded_file($this->tmpname)) {
      $this->setoption('ErrorNum',-6);
      return false;
      }else{
      return true;
      }
      }
      /*
      +--------------------------------------------------------------------
      检查文件尺寸函数
      +--------------------------------------------------------------------
    • @return boolean
      */
      private function CheckSize(){
      if ($this->filesize>$this->maxsize) {
      $this->setoption('ErrorNum',-2);
      return false;
      }else{
      return true;
      }
      }
      /**
      +---------------------------------------------------------------
    • 检查文件类型函数
      +---------------------------------------------------------------
    • @return boolean
      */
      private function CheckType(){
      if (in_array($this->filetype,$this->allowtype)) {
      return true;
      }else{
      $this->setoption('ErrorNum',-1);
      return false;
      }
      }
      private function SetFileName(){
      if ($this->israndname) {
      $this->setoption('NewName',$this->RandName());
      }else{
      $this->setoption('NewName',$this->orginame);
      }
      }
      /**
      +-----------------------------------------------------------------
    • 获取文件
      +------------------------------------------------------------------
      */
      public function getNewName() {
      return $this->newname;
      }
      private function RandName(){
      $rule=date("YmdHis").rand(0,999);
      return $rule.'.'.$this->filetype;
      }
      private function MoveFile(){
      if ($this->errornum) {
      $filepath=rtrim($this->filaepath,'/').'/';
      $filepath.=$this->newname;
      if (@move_uploaded_file($this->tmpname,$filepath)) {
      return true;
      }else{
      $this->errormsg=$this->setoption('ErrorNum',-3 );
      }
      }else{
      return false;
      }
      }
      /**
      +----------------------------------------------------------------
    • 错误信息函数
      +----------------------------------------------------------------
    • @return string
      */
      function getErrorNum() {
      $erstr="上传文件{$this->orginame}出错";
      switch ($this->errornum) {
      case 4:
      $erstr.="没有文件上传";
      break;
      case 3:
      $erstr.="文件只被部分上传";
      break;
      case 2:
      $erstr.="上传文件超过了HTML表单MAX_FILE_SIZE指定的值";
      break;
      case 1:
      $erstr.="上传文件超过了PHP.ini配置文件中upload_max_filesize的值";
      break;
      case 0:
      $erstr="上传{$this->orginame}成功";
      break;
      case -1:
      $erstr="未允许的类型";
      break;
      case -2:
      $erstr.="文件过大,不能超过{$this->maxsize}个字节";
      break;
      case -3:
      $erstr.="上传失败";
      break;
      case -4:
      $erstr="创建上传目录失败,请重新指定上传目录";
      break;
      case -5:
      $erstr="未指定上传路径";
      break;
      case -6:
      $erstr="非法操作";
      break;
      default:
      $erstr.="未知错误";

    }
    return $erstr;
    }
    }
    ?>

以上就是本文的全部内容,希望对大家学习PHP程序设计有所帮助。

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...