一个非常实用的php文件上传类


Posted in PHP onJuly 04, 2017

其实网上已经有很多这样的类了,不过出于练手的目的还是自己仿照着写了一个。

下面的代码放在一个名为UploadFile.class.php文件内

<?php
  /**
   * 文件上传
   * author:师少兵
   * email :beibeijing163@163.com
   * time :2012/12/09
   */
  class UploadFile{
    private $max_size   = '2000000'; //设置上传文件的大小,此为2M
    private $rand_name   = true;   //是否采用随机命名
    private $allow_type  = array();  //允许上传的文件扩展名
    private $error     = 0;     //错误代号
    private $msg      = '';    //信息
    private $new_name   = '';    //上传后的文件名
    private $save_path   = '';    //文件保存路径
    private $uploaded   = '';    //路径.文件名
    private $file     = '';    //等待上传的文件
    private $file_type   = array();  //文件类型
    private $file_ext   = '';    //上传文件的扩展名
    private $file_name   = '';    //文件原名称
    private $file_size   = 0;     //文件大小
    private $file_tmp_name = '';    //文件临时名称
    
    /**
     * 构造函数,初始化
     * @param string $rand_name 是否随机命名
     * @param string $save_path 文件保存路径
     * @param string $allow_type 允许上传类型
        $allow_type可为数组  array('jpg', 'jpeg', 'png', 'gif');
        $allow_type可为字符串 'jpg|jpeg|png|gif';中间可用' ', ',', ';', '|'分割
     */
    public function __construct($rand_name=true, $save_path='./upload/', $allow_type=''){
      $this->rand_name = $rand_name;
      $this->save_path = $save_path;
      $this->allow_type = $this->get_allow_type($allow_type);
    }
    
    /**
     * 上传文件
     * 在上传文件前要做的工作
     * (1) 获取文件所有信息
     * (2) 判断上传文件是否合法
     * (3) 设置文件存放路径
     * (4) 是否重命名
     * (5) 上传完成
     * @param array $file 上传文件
     *     $file须包含$file['name'], $file['size'], $file['error'], $file['tmp_name']
     */
    public function upload_file($file){
      //$this->file   = $file;
      $this->file_name   = $file['name'];
      $this->file_size   = $file['size'];
      $this->error     = $file['error'];
      $this->file_tmp_name = $file['tmp_name'];
      
      $this->ext = $this->get_file_type($this->file_name);
      
      switch($this->error){
        case 0: $this->msg = ''; break;
        case 1: $this->msg = '超出了php.ini中文件大小'; break;
        case 2: $this->msg = '超出了MAX_FILE_SIZE的文件大小'; break;
        case 3: $this->msg = '文件被部分上传'; break;
        case 4: $this->msg = '没有文件上传'; break;
        case 5: $this->msg = '文件大小为0'; break;
        default: $this->msg = '上传失败'; break;
      }
      if($this->error==0 && is_uploaded_file($this->file_tmp_name)){
        //检测文件类型
        if(in_array($this->ext, $this->allow_type)==false){
          $this->msg = '文件类型不正确';
          return false;
        }
        //检测文件大小
        if($this->file_size > $this->max_size){
          $this->msg = '文件过大';
          return false;
        }
      }
      $this->set_file_name();
      $this->uploaded = $this->save_path.$this->new_name;
      if(move_uploaded_file($this->file_tmp_name, $this->uploaded)){
        $this->msg = '文件上传成功';
        return true;
      }else{
        $this->msg = '文件上传失败';
        return false;
      }
    }
    
    /**
    * 设置上传后的文件名
    * 当前的毫秒数和原扩展名为新文件名
    */
    public function set_file_name(){
      if($this->rand_name==true){
        $a = explode(' ', microtime());
        $t = $a[1].($a[0]*1000000);
        $this->new_name = $t.'.'.($this->ext);
      }else{
        $this->new_name = $this->file_name;
      }
    }
    
    /**
    * 获取上传文件类型
    * @param string $filename 目标文件
    * @return string $ext 文件类型
    */
    public function get_file_type($filename){
      $ext = pathinfo($filename, PATHINFO_EXTENSION);
      return $ext;
    }
    
    /**
     * 获取可上传文件的类型
     */
    public function get_allow_type($allow_type){
      $s = array();
      if(is_array($allow_type)){
        foreach($allow_type as $value){
          $s[] = $value;
        }
      }else{
        $s = preg_split("/[\s,|;]+/", $allow_type);
      }
      return $s;
    }
    
    //获取错误信息
    public function get_msg(){
      return $this->msg;
    }
  }
?>

其实上面的代码中还有一个可以改进的地方,就是将那些以‘file_'开头的变量缩写为一个$file数组,这样感觉更好一些。

下面我们来测试一下上面的代码。我在一个名为upfile.php文件写测试代码,同时将UploadFile.class.php放在同一个路径下。

<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>upfile</title>
</head>
<body>
  <?php
    require 'UploadFile.class.php';
    if(isset($_POST['sf']) && $_POST['sf']=='sf'){
      if ($_FILES["file"]["error"] > 0){
        echo "Error: " . $_FILES["file"]["error"] . "<br />";
      }else{
        $file = $_FILES['file'];
        
        $upload = new UploadFile(true, './images/', array('jpg', 'jpeg', 'png'));
        $upload->upload_file($file);
        echo $upload->get_msg();
      }
    }else{
  ?>
  <form action="" method='post' enctype="multipart/form-data">
    <input type="file" name="file" id="file" />
    <input type="hidden" name="sf" value="sf"/>
    <input type="submit" value="上传" name="sub" />
  </form>
  <?php
    }
  ?>
</body>
</html>

在上面的代码中,我们可以尝试修改第15行的参数,用来判断一下我们写的方法是否正确。

这3个参数的含义分别表示:是否使用系统命名、文件存放的路径(相对)、允许上传的文件类型。那么就试试修改这3个参数会发生什么样的变化:(1)把true改为false是否就可以使用它原来的名字了;(2)改下存放路径,看看能不能依然能够上传;(3)试试上传几个不允许的文件,看能不能禁止住,而且关键第三个参数有两种形式,一种是数组,就像示例中一样;还有一种是字符串,用分隔符隔开就行, 'jpg|jpeg|png|gif', 'jpg jpeg png gif', 'jpg,jpeg,png,gif'都行。

好的,文件上传类就这样写好了。

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

PHP 相关文章推荐
PHP 日期时间函数的高级应用技巧
Oct 10 PHP
php 获取百度的热词数据的代码
Feb 18 PHP
新手菜鸟必读:session与cookie的区别
Aug 22 PHP
ini_set的用法介绍
Jan 07 PHP
php中rename函数用法分析
Nov 15 PHP
简单实用的PHP防注入类实例
Dec 05 PHP
thinkphp备份数据库的方法分享
Jan 04 PHP
PHP程序员不应该忽略的3点
Oct 09 PHP
10个php函数实用却不常见
Oct 13 PHP
修改Laravel自带的认证系统的User类的命名空间的步骤
Oct 15 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
Dec 01 PHP
PHP fopen中文文件名乱码问题解决方案
Oct 28 PHP
php基于数组函数实现关联表的编辑操作示例
Jul 04 #PHP
PHP基于方差和标准差计算学生成绩的稳定性示例
Jul 04 #PHP
PHP处理bmp格式图片的方法分析
Jul 04 #PHP
PHP实现对文件锁进行加锁、解锁操作的方法
Jul 04 #PHP
PHP利用Cookie设置用户30分钟未操作自动退出功能
Jul 03 #PHP
PHP错误处理函数register_shutdown_function使用示例
Jul 03 #PHP
PHP使用preg_split和explode分割textarea存放内容的方法分析
Jul 03 #PHP
You might like
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
2012/09/23 PHP
在PHP语言中使用JSON和将json还原成数组的方法
2016/07/19 PHP
php中strtotime函数性能分析
2016/11/20 PHP
Bootstrap+PHP实现多图上传功能实例详解
2018/04/08 PHP
js中的值类型和引用类型小结 文字说明与实例
2010/12/12 Javascript
jquery.Jwin.js 基于jquery的弹出层插件代码
2012/05/23 Javascript
Node.js异步I/O学习笔记
2014/11/04 Javascript
jQuery入门介绍之基础知识
2015/01/13 Javascript
jQuery操作属性和样式详解
2016/04/13 Javascript
浅析Javascript中bind()方法的使用与实现
2016/04/29 Javascript
解析JavaScript模仿块级作用域
2016/12/29 Javascript
js原生Ajax的封装和原理详解
2017/03/11 Javascript
js 函数式编程学习笔记
2017/03/25 Javascript
jQuery响应滚动条事件功能示例
2017/10/14 jQuery
Python Tkinter基础控件用法
2014/09/03 Python
在Python的列表中利用remove()方法删除元素的教程
2015/05/21 Python
在Python程序中操作文件之isatty()方法的使用教程
2015/05/24 Python
Python中函数及默认参数的定义与调用操作实例分析
2017/07/25 Python
Python装饰器(decorator)定义与用法详解
2018/02/09 Python
网红编程语言Python将纳入高考你怎么看?
2018/06/07 Python
Python面向对象之接口、抽象类与多态详解
2018/08/27 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
2018/09/03 Python
Python 一键制作微信好友图片墙的方法
2019/05/16 Python
Python猫眼电影最近上映的电影票房信息
2020/09/18 Python
CSS3简单实现照片墙
2014/12/12 HTML / CSS
数控专业大学毕业生职业规划范文
2014/02/06 职场文书
优秀老员工获奖感言
2014/02/15 职场文书
妇女工作先进事迹
2014/08/17 职场文书
企业授权委托书范本
2014/09/22 职场文书
婚前协议书标准版
2014/10/19 职场文书
2014年社区教育工作总结
2014/12/02 职场文书
大学生求职意向书
2015/05/11 职场文书
八一建军节主持词
2015/07/01 职场文书
《山中访友》教学反思
2016/02/24 职场文书
导游词之广州陈家祠
2019/10/21 职场文书
SQL SERVER存储过程用法详解
2022/02/24 SQL Server