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


Posted in PHP onMay 15, 2016

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

<?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程序设计有所帮助。

PHP 相关文章推荐
PHP中文URL编解码(urlencode()rawurlencode()
Jul 03 PHP
PHP导入Excel到MySQL的方法
Apr 23 PHP
使用Curl进行抓取远程内容时url中文编码问题示例探讨
Oct 29 PHP
php中getservbyport与getservbyname函数用法实例
Nov 18 PHP
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
Nov 24 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
Jan 11 PHP
php实现中文转数字
Feb 18 PHP
Symfony2学习笔记之模板用法详解
Mar 17 PHP
php英文单词统计器
Jun 23 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
Sep 02 PHP
thinkphp3.2实现在线留言提交验证码功能
Jul 19 PHP
php模拟post提交请求调用接口示例解析
Aug 07 PHP
php metaphone()函数及php localeconv() 函数实例解析
May 15 #PHP
非常实用的php验证码类
May 15 #PHP
thinkphp框架下404页面设置 仅三步
May 14 #PHP
php基于CodeIgniter实现图片上传、剪切功能
May 14 #PHP
PHP单例模式是什么 php实现单例模式的方法
May 14 #PHP
PHP pear安装配置教程
May 14 #PHP
php+html5+ajax实现上传图片的方法
May 14 #PHP
You might like
php下过滤html代码的函数 提高程序安全性
2010/03/02 PHP
又十个超级有用的PHP代码片段
2015/09/24 PHP
PHP微商城开源代码实例
2019/03/27 PHP
js获取某月的最后一天日期的简单实例
2013/06/22 Javascript
Jquery 数组操作大全个人总结
2013/11/13 Javascript
用js通过url传参把数据从一个页面传到另一个页面
2014/09/01 Javascript
JavaScript代码轻松实现网页内容禁止复制(代码简单)
2015/10/23 Javascript
jQuery实现获取table表格第一列值的方法
2016/03/01 Javascript
vueJS简单的点击显示与隐藏的效果【实现代码】
2016/05/03 Javascript
Node.js中使用jQuery的做法
2016/08/17 Javascript
js图片切换具体实现代码
2016/10/13 Javascript
详解微信小程序开发之下拉刷新 上拉加载
2016/11/24 Javascript
Javascript中八种遍历方法的执行速度深度对比
2017/04/25 Javascript
JS实现点击拉拽轮播图pc端移动端适配
2018/09/05 Javascript
使用vue完成微信公众号网页小记(推荐)
2019/04/28 Javascript
JavaScript实现网页留言板功能
2020/11/23 Javascript
[04:44]DOTA2 2017全国高校联赛视频回顾
2017/08/21 DOTA
python访问sqlserver示例
2014/02/10 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
2019/01/30 Python
Python中模块(Module)和包(Package)的区别详解
2019/08/07 Python
解析Tensorflow之MNIST的使用
2020/06/30 Python
浅谈Python 命令行参数argparse写入图片路径操作
2020/07/12 Python
scrapy结合selenium解析动态页面的实现
2020/09/28 Python
python实现简单猜单词游戏
2020/12/24 Python
termux中matplotlib无法显示中文问题的解决方法
2021/01/11 Python
matplotlib部件之套索Lasso的使用
2021/02/24 Python
使用css3实现的tab选项卡代码分享
2014/12/09 HTML / CSS
css3实现多个元素依次显示效果
2017/12/12 HTML / CSS
英国布鲁姆精品店:Bloom Boutique
2018/03/01 全球购物
巴西独家产品和现场演示购物网站:Shoptime
2019/07/11 全球购物
《草原的早晨》教学反思
2014/04/08 职场文书
十佳好少年事迹材料
2014/08/21 职场文书
未婚证明范本
2015/06/15 职场文书
优秀教师主要事迹材料
2015/11/04 职场文书
html输入两个数实现加减乘除功能
2021/07/01 HTML / CSS
Python读写yaml文件
2022/03/20 Python