温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

PHP中如何实现文件上传类

发布时间:2021-08-31 13:51:29 来源:亿速云 阅读:198 作者:小新 栏目:开发技术

小编给大家分享一下PHP中如何实现文件上传类,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

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

<?php  /**   +-----------------------------------------------------------------------------   * 文件上传类   +-----------------------------------------------------------------------------   * @author Administrator   +-----------------------------------------------------------------------------   */   class FileUpload{        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], $tmpname[$i], $filesize[$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,$tmpname,$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="上传文件<font color='red'>{$this->orginame}</font>出错";      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中如何实现文件上传类”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php
AI