非常经典的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 相关文章推荐
一个SQL管理员的web接口
Oct 09 PHP
ThinkPHP实现将SESSION存入MYSQL的方法
Jul 22 PHP
PHP写日志的实现方法
Nov 05 PHP
php防止CC攻击代码 php防止网页频繁刷新
Dec 21 PHP
thinkPHP下ueditor的使用方法详解
Dec 26 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
Jan 05 PHP
PHP Static延迟静态绑定用法分析
Mar 16 PHP
使用Codeigniter重写insert的方法(推荐)
Mar 23 PHP
PHP设计模式之工厂模式实例总结
Sep 01 PHP
PHP面向对象之里氏替换原则简单示例
Apr 08 PHP
laravel 实现关闭CSRF(全部关闭、部分关闭)
Oct 21 PHP
php 使用 __call实现重载功能示例
Nov 18 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往windows中添加用户
2006/12/06 PHP
php类中private属性继承问题分析
2012/11/01 PHP
如何使用PHP批量去除文件UTF8 BOM信息
2013/08/05 PHP
php 运算符与表达式详细介绍
2016/11/30 PHP
thinkPHP实现的联动菜单功能详解
2017/05/05 PHP
PHP单元测试框架PHPUnit用法详解
2019/01/23 PHP
IE不出现Flash激活框的小发现的js实现方法
2007/09/07 Javascript
node在两个div之间移动,用ztree实现
2013/03/06 Javascript
jquery的ajax简单结构示例代码
2014/02/17 Javascript
告诉你什么是javascript的回调函数
2014/09/04 Javascript
Javascript基础知识(一)核心基础语法与事件模型
2014/09/29 Javascript
JS+CSS实现的日本门户网站经典选项卡导航效果
2015/09/27 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
2016/12/21 Javascript
原生js实现鼠标跟随效果
2017/02/28 Javascript
layer页面跳转,获取html子节点元素的值方法
2019/09/27 Javascript
vscode调试node.js的实现方法
2020/03/22 Javascript
分享15个最受欢迎的Python开源框架
2014/07/13 Python
在Python中使用HTMLParser解析HTML的教程
2015/04/29 Python
python 的列表遍历删除实现代码
2020/04/12 Python
Python通过RabbitMQ服务器实现交换机功能的实例教程
2016/06/29 Python
Python 编码Basic Auth使用方法简单实例
2017/05/25 Python
CentOS 7下安装Python 3.5并与Python2.7兼容并存详解
2017/07/07 Python
对pycharm代码整体左移和右移缩进快捷键的介绍
2018/07/16 Python
python设计微型小说网站(基于Django+Bootstrap框架)
2019/07/08 Python
树莓派使用python-librtmp实现rtmp推流h264的方法
2019/07/22 Python
Python 防止死锁的方法
2020/07/29 Python
Pycharm Plugins加载失败问题解决方案
2020/11/28 Python
世界上最大的高分辨率在线图片库:Alamy
2018/07/07 全球购物
Linux文件系统类型
2012/02/15 面试题
十佳大学生事迹材料
2014/01/29 职场文书
小学生元旦感言
2014/02/26 职场文书
作风建设整改方案
2014/10/27 职场文书
导游词之襄阳古城
2019/09/27 职场文书
Python基础之元编程知识总结
2021/05/23 Python
搭建Yolov5服务器
2022/04/30 Servers
Win11 Dev 预览版25174.1000发布 (附更新修复内容汇总)
2022/08/05 数码科技