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 相关文章推荐
PHP6 先修班 JSON实例代码
Aug 23 PHP
zf框架的Filter过滤器使用示例
Mar 13 PHP
PHP和javascript常用正则表达式及用法实例
Jul 01 PHP
PHP常用技术文之文件操作和目录操作总结
Sep 27 PHP
php与Mysql的一些简单的操作
Feb 26 PHP
PHP面向对象程序设计OOP继承用法入门示例
Dec 27 PHP
在php7中MongoDB实现模糊查询的方法详解
May 03 PHP
深入理解PHP的远程多会话调试
Sep 21 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
Nov 10 PHP
PHP实现合并两个排序链表的方法
Jan 19 PHP
laravel实现按时间日期进行分组统计方法示例
Mar 23 PHP
laravel框架如何设置公共头和公共尾
Oct 22 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 array_search() 函数使用
2010/04/13 PHP
调用WordPress函数统计文章访问量及PHP原生计数器的实现
2016/03/21 PHP
thinkphp3.2实现上传图片的控制器方法
2016/04/28 PHP
PHP中函数gzuncompress无法使用的解决方法
2017/03/02 PHP
yii2中关于加密解密的那些事儿
2018/06/12 PHP
PHP中quotemeta()函数的用法讲解
2019/04/04 PHP
javascript应用:Iframe自适应其加载的内容高度
2007/04/10 Javascript
Ajax 数据请求的简单分析
2011/04/05 Javascript
window.open不被拦截的实现代码
2012/08/22 Javascript
JQuery 中几个类选择器的简单使用介绍
2013/03/14 Javascript
jQuery控制输入框只能输入数值的小例子
2013/03/20 Javascript
JS判断表单输入是否为空(示例代码)
2013/12/23 Javascript
浅谈javascript构造函数与实例化对象
2015/06/22 Javascript
JQuery实现左右滚动菜单特效
2015/09/28 Javascript
url中的特殊符号有什么含义(推荐)
2016/06/17 Javascript
JS给Array添加是否包含字符串的简单方法
2016/10/29 Javascript
COM组件中调用JavaScript函数详解及实例
2017/02/23 Javascript
微信小程序 跳转传参数与传对象详解及实例代码
2017/03/14 Javascript
使用jQuery和ajax代替iframe的方法(详解)
2017/04/12 jQuery
VUE前后端学习tab写法实例
2019/08/06 Javascript
JavaScript中CreateTextFile函数
2020/08/30 Javascript
python 中split 和 strip的实例详解
2017/07/12 Python
Python字典创建 遍历 添加等实用基础操作技巧
2018/09/13 Python
Python实现的KMeans聚类算法实例分析
2018/12/29 Python
python paramiko利用sftp上传目录到远程的实例
2019/01/03 Python
对pyqt5多线程正确的开启姿势详解
2019/06/14 Python
详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别)
2019/08/02 Python
python使用OpenCV模块实现图像的融合示例代码
2020/04/10 Python
Python 中Operator模块的使用
2021/01/30 Python
一家外企的面试题目(C/C++面试题,C语言面试题)
2014/03/24 面试题
公司总经理任命书
2014/06/05 职场文书
读群众路线的心得体会
2014/09/03 职场文书
个人授权委托书范本
2014/09/14 职场文书
成绩单家长意见
2015/06/03 职场文书
我的中国梦心得体会范文
2016/01/05 职场文书
python实现图片九宫格分割的示例
2021/04/25 Python