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 中的批处理的实现
Jun 14 PHP
解析php DOMElement 操作xml 文档的实现代码
May 10 PHP
php中如何防止表单的重复提交
Aug 02 PHP
php返回json数据函数实例
Oct 09 PHP
PHP中的socket_read和socket_recv区别详解
Feb 09 PHP
PHP扩展程序实现守护进程
Apr 16 PHP
PHP实现简单数字分页效果
Jul 26 PHP
php PDO实现的事务回滚示例
Mar 23 PHP
thinkPHP5项目中实现QQ第三方登录功能
Oct 20 PHP
php实现微信分享朋友链接功能
Feb 18 PHP
Laravel 5.4前后台分离,通过不同的二级域名访问方法
Oct 13 PHP
Yii框架 session 数据库存储操作方法示例
Nov 18 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调用Java对象的方法
2006/10/09 PHP
php和js如何通过json互相传递数据相关问题探讨
2013/02/26 PHP
深入理解用mysql_fetch_row()以数组的形式返回查询结果
2013/06/05 PHP
20个2014年最优秀的PHP框架回顾
2014/10/22 PHP
PHP使用DirectoryIterator显示下拉文件列表的方法
2015/03/13 PHP
php给图片添加文字水印方法汇总
2015/08/27 PHP
[原创]php简单防盗链验证实现方法
2016/07/09 PHP
jQuery jqgrid 对含特殊字符json 数据的 Java 处理方法
2011/01/01 Javascript
js中用window.open()打开多个窗口的name问题
2014/03/13 Javascript
JavaScript实现基于Cookie的存储类实例
2015/04/10 Javascript
javascript实现加载xml文件的方法
2015/11/24 Javascript
JavaScript基础篇(3)之Object、Function等引用类型
2015/11/30 Javascript
javascript实现倒计时跳转页面
2016/01/17 Javascript
Nodejs中session的简单使用及通过session实现身份验证的方法
2016/02/04 NodeJs
javascript 数组的定义和数组的长度
2016/06/07 Javascript
微信小程序之MaterialDesign--input组件详解
2017/02/15 Javascript
iframe与主框架跨域相互访问实现方法
2017/09/14 Javascript
axios 处理 302 状态码的解决方法
2018/04/10 Javascript
jQuery动态移除与增加onclick属性的方法详解
2018/06/07 jQuery
Vue 实现手动刷新组件的方法
2019/02/19 Javascript
微信小程序实现圆形进度条动画
2020/11/18 Javascript
JS实现时间校验的代码
2020/05/25 Javascript
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
使用python获取CPU和内存信息的思路与实现(linux系统)
2014/01/03 Python
Python httplib模块使用实例
2015/04/11 Python
用Python实现命令行闹钟脚本实例
2016/09/05 Python
20招让你的Python飞起来!
2016/09/27 Python
在centos7中分布式部署pyspider
2017/05/03 Python
Python简单生成随机姓名的方法示例
2017/12/27 Python
PyQt5+requests实现车票查询工具
2019/01/21 Python
德国宠物用品、宠物食品及水族馆网上商店:ZooRoyal
2017/07/09 全球购物
俄罗斯极限运动网上商店:Board Shop №1
2020/12/18 全球购物
我的applet原先好好的, 一放到web server就会有问题,为什么?
2016/05/10 面试题
环保建议书200字
2014/05/14 职场文书
圣贤教育改变命运观后感
2015/06/16 职场文书
Redis分布式锁的7种实现
2022/04/01 Redis