php文件上传类的分享


Posted in PHP onJuly 06, 2017

本文实例为大家分享了php文件上传类的具体代码,供大家参考,具体内容如下

<?php
$upload = new UpLoad();
$upload->uploadFile('fm');
/*打印错误信息*/
// var_dump($upload->errorNumber);
// var_dump($upload->errorInfo);
class UpLoad{
  //文件上传路径
  protected $path = 'upload/';
  //允许文件上传的后缀
  protected $allowSuffix = ['jpg','jpeg',
  'gif','wbmp','png'];
  //mime类型 
  protected $allowMime =['image/jpg','image/jpeg',
  'image/gif','image/wbmp','image/png'];
  //允许上传的大小
  protected $maxSize = 2000000;
  //是否启用默认的前缀
  protected $isRandName =true ;
  //文件的前缀
  protected $prefix = 'up_';
  //错误号和错误信息
  protected $errorNumber;
  protected $errorInfo;
  //文件的信息
  //文件名
  protected $oldName;
  //文件的后缀
  protected $suffix;
  //文件的大小
  protected $size;
  //文件的mime
  protected $mime;
  //文件的临时文件的路径
  protected $tmpName;
  //文件新名字
  protected $newName;
  
  //构造方法
  //因为成员属性比较多就用数组来显示
  public function __construct($arr =[]){
    foreach ($arr as $key=>$value){
      $this->setOption($key,$value);
    }
  }
  //判断$key是不是我的成员属性,如果是就设置
  protected function setOption($key,$value){
    //得到所有的成员属性
    $keys = array_keys(get_class_vars(__CLASS__));
    if(in_array($key, $keys)){
      $this->$key = $value;
    }
  }
  //文件上传函数
  //key 就是input框中的name属性值
  public function uploadFile($key){
    //判断有没有设置路径 path
    if(empty($this->path)){
      $this->setOption('errorNumber',-1 );
      return false;
    }
    //判断该路径是否存在是否可写
    if (!$this->check()){
      $this->setOption('errorNumber', -2);
      return false; 
    }
    //判断$_FILES里面的error信息是否为0,如果为0则说明文件信息在服务器端可以直接获取,提取信息保存到成员属性中
    $error = $_FILES[$key]['error'];
    if($error){
      $this->setOption('errorNumber', -3);
      return false;
    }else {
      //提取文件相关信息并且保存到成员属性中
      $this->getFileInfo($key);
    }
    //判断文件的大小、mime、后缀是否符合
     if(!$this->checkSize() || !$this->checkMime()|| !$this->checkSuffix()){
       return false;
     }
    //得到新的文件名字
    $this->newName = $this->createNewName();
    //判断是否是上传文件,并且是移动上传文件
    if(is_uploaded_file($this->tmpName)){
      if(move_uploaded_file($this->tmpName, $this->path.$this->newName)){
        return $this->path.$this->newName;
      }else {
        $this->setOption('errorNumber', -7);
        return false;
      }
    }else{
      $this->setOption('errorNumber', -6);
      return false;
    }
  }
  //检测文件夹是否存在,是否可写
  protected function check(){
    //文件夹不存在或者不是目录。创建文件夹
    if(!file_exists($this->path) ||!is_dir($this->path)){
      return mkdir($this->path,0777,true);
    }
    //判断文件是否可写
    if(!is_writeable($this->path)){
      return chmod($this->path, 0777);
    }
    return true;
  }
  //根据key得到文件信息
  protected function getFileInfo($key){
    //得到文件的名字
    $this->oldName = $_FILES[$key]['name'];
    //得到文件的mime类型
    $this->mime = $_FILES[$key]['type'];
    //得到文件的临时文件
    $this->tmpName = $_FILES[$key]['tmp_name'];
    //得到文件大小
    $this->size = $_FILES[$key]['size'];
    //得到文件后缀
    $this->suffix = pathinfo($this->oldName)['extension'];
  }
  //判断文件大小
  protected function checkSize(){
    if($this->size > $this->maxSize){
      $this->setOption('errorNumber', -3);
      return false;
    }
    return true;
  }
  //判断mime类型
  protected function checkMime(){
    if(!in_array($this->mime, $this->allowMime)){
      $this->setOption('errorNumber', -4);
      return false;
    }
    return true;
  }
  //判断后缀
  protected function checkSuffix(){
    if(!in_array($this->suffix, $this->allowSuffix)){
      $this->setOption('errorNumber', -5);
      return false;
    }
    return true;
  }
  //创建新名字
  protected function createNewName(){
    if($this->isRandName){
      $name = $this->prefix.uniqid().'.'.$this->suffix;
    }else {
      $name = $this->prefix.$this->oldName;
    }
    return $name;
  }
  public function __get($name){
    if($name == 'errorNumber'){
      return $this->errorNumber;
    }elseif ($name == 'errorInfo'){
      return $this->getErrorInfo();
    }
  }
  protected function getErrorInfo(){
    switch ($this->errorNumber){
    case -1:
      $str = '文件路径没有设置';
      break;
    case -2:
      $str = '文件不是目录或者不可写';
      break;
    case -3:
      $str = '文件超过指定大小';
      break;
    case -4:
      $str = 'mime类型不符合';
      break;
    case -5:
      $str = '文件后缀不符合';
      break;
    case -6:
      $str = '不是上传文件';
      break;
    case -7:
      $str = '移动失败';
      break;
    case 1:
      $str = '超出ini设置大小';
      break;
    case 2:
      $str = '超出html表单大小';
      break;
    case 3:
      $str = '文章只有部分上传';
      break;
    case 4:
      $str = '没有文件上传';
      break;
    case 6:
      $str = '找不到临时文件';
      break;
    case 7:
      $str = '文件写入失败';
      break;
    }
    return $str;
  }
}
<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <title>文件上传</title>
</head>
<body>
<form action="UpLoad.php" method="post" enctype="multipart/form-data" >
   <input type="file" name="fm" value=""><br>
  <input type="submit" value="上传文件" /><br>
 
</form>
</body>
</html>

注意:input中的name必须和上传类中的uploadFile中是传值一致!

更多精彩内容请参考php文件上传操作汇总进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
Windows下PHP5和Apache的安装与配置
Sep 05 PHP
PHP脚本的10个技巧(6)
Oct 09 PHP
PHP session常见问题集锦及解决办法总结
Mar 18 PHP
php读取javascript设置的cookies的代码
Apr 12 PHP
解析php取整的几种方式
Jun 25 PHP
php二分查找二种实现示例
Mar 12 PHP
php顺序查找和二分查找示例
Mar 27 PHP
PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
Aug 28 PHP
PHP获取POST数据的几种方法汇总
Mar 03 PHP
编写PHP脚本过滤用户上传的图片
Jul 03 PHP
PHP模拟asp中response类实现方法
Aug 08 PHP
CI(CodeIgniter)模型用法实例分析
Jan 20 PHP
PHP图片水印类的封装
Jul 06 #PHP
php生出随机字符串
Jul 06 #PHP
PHP实现的分页类定义与用法示例
Jul 05 #PHP
PHP实现的文件上传类与用法详解
Jul 05 #PHP
PHP基于GD库实现的生成图片缩略图函数示例
Jul 05 #PHP
PHP实现的下载远程文件类定义与用法示例
Jul 05 #PHP
详解PHP使用Redis存储session时的一个Warning定位
Jul 05 #PHP
You might like
php在页面中调用fckeditor编辑器的方法
2011/06/10 PHP
phpMyAdmin出现无法载入 mcrypt 扩展,请检查PHP配置的解决方法
2012/03/26 PHP
PHP中替换换行符的几种方法小结
2012/10/15 PHP
PHP中把数据库查询结果输出为json格式简单实例
2015/04/09 PHP
PHP实现伪静态方法汇总
2016/01/13 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
2018/04/20 PHP
JavaScript isPrototypeOf和hasOwnProperty使用区别
2010/03/04 Javascript
基于jquery的仿百度搜索框效果代码
2011/04/11 Javascript
javascript中怎么做对象的类型判断
2013/11/11 Javascript
jquery easyui中treegrid用法的简单实例
2014/02/18 Javascript
js面向对象编程之如何实现方法重载
2014/07/02 Javascript
JavaScript中用let语句声明作用域的用法讲解
2016/05/20 Javascript
Vue如何实现组件的源码解析
2017/06/08 Javascript
使用 Vue 绑定单个或多个 Class 名的实例代码
2018/01/08 Javascript
vue写一个组件
2018/04/09 Javascript
axios 封装上传文件的请求方法
2018/09/26 Javascript
微信小程序Page中data数据操作和函数调用方法
2019/05/08 Javascript
使用vuex解决刷新页面state数据消失的问题记录
2019/05/08 Javascript
es6中reduce的基本使用方法
2019/09/10 Javascript
vuex实现像调用模板方法一样调用Mutations方法
2019/11/06 Javascript
python实现批量转换文件编码(批转换编码示例)
2014/01/23 Python
深入浅出学习python装饰器
2017/09/29 Python
python: 自动安装缺失库文件的方法
2018/10/22 Python
Django-Scrapy生成后端json接口的方法示例
2020/10/06 Python
印度最好的在线药品订购网站:PharmEasy
2018/11/30 全球购物
adidas瑞典官方网站:购买阿迪达斯鞋子和运动服
2019/12/11 全球购物
介绍一下结构化程序设计方法和面向对象程序设计方法的区别
2012/06/27 面试题
迟到检讨书300字
2014/02/14 职场文书
家长会主持词开场白
2014/03/18 职场文书
淘宝好评语大全
2014/05/05 职场文书
会员卡清退活动总结
2014/08/27 职场文书
退税申请报告怎么写
2015/05/18 职场文书
政审证明材料
2015/06/19 职场文书
Python可视化学习之seaborn调色盘
2022/02/24 Python
python保存图片的四个常用方法
2022/02/28 Python