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 相关文章推荐
PHP中在数据库中保存Checkbox数据(1)
Oct 09 PHP
PHP has encountered an Access Violation 错误的解决方法
Jan 17 PHP
php flv视频时间获取函数
Jun 29 PHP
php进行支付宝开发中return_url和notify_url的区别分析
Dec 22 PHP
thinkPHP学习笔记之安装配置篇
Mar 05 PHP
PHP数组相关函数汇总
Mar 24 PHP
php实现scws中文分词搜索的方法
Dec 25 PHP
yii2中使用Active Record模式的方法
Jan 09 PHP
PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)
Sep 11 PHP
Laravel 集成 Geetest验证码的方法
May 14 PHP
php中html_entity_decode实现HTML实体转义
Jun 13 PHP
PHP实现简单的计算器
Aug 28 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
如何开始收听短波广播
2021/03/01 无线电
网络资源
2006/10/09 PHP
探讨PHP使用eAccelerator的API开发详解
2013/06/09 PHP
PHP判断是否有Get参数的方法
2014/05/05 PHP
php数组函数array_walk用法示例
2016/05/26 PHP
PHP基于socket实现的简单客户端和服务端通讯功能示例
2017/07/10 PHP
PHP编程中的Session阻塞问题与解决方法分析
2017/08/07 PHP
laravel 解决强制跳转 https的问题
2019/10/22 PHP
用JavaScript脚本实现Web页面信息交互
2006/10/11 Javascript
基于jquery的二级联动菜单实现代码
2011/04/25 Javascript
jQuery对table表格进行增删改查
2020/12/22 Javascript
Node.js中.pfx后缀文件的处理方法
2017/03/10 Javascript
详解ECMAScript6入门--Class对象
2017/04/27 Javascript
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
2017/08/01 jQuery
JavaScript解析JSON数据示例
2019/07/16 Javascript
如何通过shell脚本自动生成vue文件详解
2019/09/10 Javascript
Vue实现圆环进度条的示例
2021/02/06 Vue.js
python中while循环语句用法简单实例
2015/05/07 Python
python基础教程之分支、循环简单用法
2016/06/16 Python
Python利用字典将两个通讯录文本合并为一个文本实例
2018/01/16 Python
python实现自动登录后台管理系统
2018/10/18 Python
对python的bytes类型数据split分割切片方法
2018/12/04 Python
PHP如何设置和取得Cookie值
2015/06/30 面试题
C#可否对内存进行直接的操作
2015/02/26 面试题
学前教育毕业生自荐信范文
2013/12/24 职场文书
名人演讲稿范文
2013/12/28 职场文书
党校培训自我鉴定范文
2014/04/10 职场文书
2014年英语教学工作总结
2014/12/17 职场文书
同学毕业留言寄语
2015/02/27 职场文书
2015年班主任个人工作总结
2015/03/31 职场文书
导游词之寿县报恩寺
2020/01/19 职场文书
JS数组的常用方法整理
2021/03/31 Javascript
mysql中between的边界,范围说明
2021/06/08 MySQL
SQL基础查询和LINQ集成化查询
2022/01/18 MySQL
python实现商品进销存管理系统
2022/05/30 Python
PostgreSQL之连接失败的问题及解决
2023/05/08 PostgreSQL