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中对xml读取的相关函数的介绍一
Jun 05 PHP
PHP 判断常量,变量和函数是否存在
Apr 26 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-1 开始了解php
Jul 03 PHP
iis下php mail函数的sendmail配置方法(官方推荐)
Apr 25 PHP
全新的PDO数据库操作类php版(仅适用Mysql)
Jul 22 PHP
PHP实现下载断点续传的方法
Nov 12 PHP
php支持中文字符串分割的函数
May 28 PHP
thinkphp在低版本Nginx 下支持PATHINFO的方法分享
May 27 PHP
PHP通过加锁实现并发情况下抢码功能
Aug 10 PHP
基于PHP常用文件函数和目录函数整理
Aug 17 PHP
tp5(thinkPHP5框架)captcha验证码配置及验证操作示例
May 28 PHP
php中的钩子理解及应用实例分析
Aug 30 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分页显示制作详细讲解
2006/12/05 PHP
MySQL中create table语句的基本语法是
2007/01/15 PHP
ThinkPHP上使用多说评论插件的方法
2014/10/31 PHP
PHP实现获取某个月份周次信息的方法
2015/08/11 PHP
初识PHP中的Swoole
2016/04/05 PHP
Zend Framework实现自定义过滤器的方法
2016/12/09 PHP
Yii2框架可逆加密简单实现方法
2017/08/25 PHP
javascript面向对象的方式实现的弹出层效果代码
2010/01/28 Javascript
JQuery 插件制作实践 xMarquee插件V1.0
2010/04/02 Javascript
jQuery UI 实现email输入提示实例
2013/08/15 Javascript
jquery插件推荐 jquery.cookie
2014/11/09 Javascript
html的DOM中document对象anchors集合用法实例
2015/01/21 Javascript
JavaScript获取页面中超链接数量的方法
2015/11/09 Javascript
js 自带的sort() 方法全面了解
2016/08/16 Javascript
如何判断出一个js对象是否一个dom对象
2016/11/24 Javascript
浅谈在react中如何实现扫码枪输入
2018/07/04 Javascript
NodeJs生成sitemap站点地图的方法示例
2019/06/11 NodeJs
微信小程序实现左侧滑栏过程解析
2019/08/26 Javascript
Jquery+AJAX实现无刷新上传并重命名文件操作示例【PHP后台接收】
2020/05/29 jQuery
[15:09]DOTA2国际邀请赛采访专栏:Loda
2013/08/06 DOTA
[01:21:36]CHAOS vs Alliacne 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[05:37]DOTA2-DPC中国联赛 正赛 Elephant vs iG 选手采访
2021/03/11 DOTA
Python学习之用pygal画世界地图实例
2017/12/07 Python
自学python的建议和周期预算
2019/01/30 Python
很酷的python表白工具 你喜欢我吗
2019/04/11 Python
50行Python代码获取高考志愿信息的实现方法
2019/07/23 Python
python输出带颜色字体实例方法
2019/09/01 Python
美国顶级奢侈茶:Mighty Leaf Tea(美泰茶)
2016/11/26 全球购物
中国电子产品批发商/跨境电商/外贸网:Sunsky-online
2020/04/20 全球购物
见习期自我鉴定
2013/11/07 职场文书
献爱心倡议书
2014/04/14 职场文书
老人院义工活动感想
2015/08/07 职场文书
将图片保存到mysql数据库并展示在前端页面的实现代码
2021/05/02 MySQL
Centos7中MySQL数据库使用mysqldump进行每日自动备份的编写
2021/08/02 MySQL
mysql函数全面总结
2021/11/11 MySQL
vue项目配置sass及引入外部scss文件
2022/04/14 Vue.js