非常经典的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 Mysql类 可以参考学习熟悉下
Jun 21 PHP
用PHP写的基于Memcache的Queue实现代码
Nov 27 PHP
深入file_get_contents函数抓取内容失败的原因分析
Jun 25 PHP
PHP mail()函数使用及配置方法
Jan 14 PHP
浅谈php安全性需要注意的几点事项
Jul 17 PHP
php中error与exception的区别及应用
Jul 28 PHP
Win2003+apache+PHP+SqlServer2008 配置生产环境
Jul 29 PHP
常用PHP数组排序函数归纳
Aug 08 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
Sep 22 PHP
PHP模型Model类封装数据库操作示例
Mar 14 PHP
windows系统php环境安装swoole具体步骤
Mar 04 PHP
PHP实现考试倒计时功能代码
Apr 16 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
图形数字验证代码
2006/10/09 PHP
基于mysql的论坛(3)
2006/10/09 PHP
php查找任何页面上的所有链接的方法
2013/12/03 PHP
php上传文件并存储到mysql数据库的方法
2015/03/16 PHP
php实现搜索一维数组元素并删除二维数组对应元素的方法
2015/07/06 PHP
PHP正则匹配日期和时间(时间戳转换)的实例代码
2016/12/14 PHP
由php中字符offset特征造成的绕过漏洞详解
2017/07/07 PHP
laravel 实现用户登录注销并限制功能
2019/10/24 PHP
javascript下4个跨浏览器必备的函数
2010/03/07 Javascript
在javascript中如何得到中英文混合字符串的长度
2014/01/17 Javascript
DOM基础教程之事件类型
2015/01/20 Javascript
Node.js node-schedule定时任务隔多少分钟执行一次的方法
2015/02/10 Javascript
通过网页查看JS源码中汉字显示乱码的解决方法
2016/10/26 Javascript
JS实现多级菜单中当前菜单不随页面跳转样式而发生变化
2017/05/30 Javascript
微信小程序仿美团城市选择
2018/06/06 Javascript
在vue里使用codemirror遇到的问题
2018/11/01 Javascript
js中的面向对象之对象常见创建方法详解
2019/12/16 Javascript
Vue实现简易计算器
2020/02/25 Javascript
Python sys.path详细介绍
2013/10/17 Python
python3使用tkinter实现ui界面简单实例
2014/01/10 Python
Python 的类、继承和多态详解
2017/07/16 Python
python os模块简单应用示例
2019/05/23 Python
Python数据可视化实现多种图例代码详解
2020/07/14 Python
Bootstrap 学习分享
2012/11/12 HTML / CSS
一家专门做特卖的网站:唯品会
2016/10/09 全球购物
全球高级音频和视频专家:HiDef Lifestyle
2019/08/02 全球购物
2014年党支部承诺书
2014/05/30 职场文书
2014年商场工作总结
2014/11/22 职场文书
党的群众路线教育实践活动先进个人材料
2014/12/24 职场文书
大学毕业论文致谢词
2015/05/14 职场文书
nginx配置ssl实现https的方法示例
2021/03/31 Servers
pandas:get_dummies()与pd.factorize()的用法及区别说明
2021/05/21 Python
使用Python脚本对GiteePages进行一键部署的使用说明
2021/05/27 Python
你知道哪几种MYSQL的连接查询
2021/06/03 MySQL
python和C/C++混合编程之使用ctypes调用 C/C++的dll
2022/04/29 Python
python数字图像处理之图像自动阈值分割示例
2022/06/28 Python