一个非常实用的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 异常处理实现代码
Mar 10 PHP
Zend的MVC机制使用分析(二)
May 02 PHP
9条PHP编程小知识及易犯的小错误
Jan 22 PHP
PHP获取当前日期和时间及格式化方法参数
May 11 PHP
通过Email发送PHP错误的方法
Jul 20 PHP
总结PHP中DateTime的常用方法
Aug 11 PHP
php+mysql查询实现无限下级分类树输出示例
Oct 03 PHP
php微信公众号开发(2)百度BAE搭建和数据库使用
Dec 15 PHP
php preg_match的匹配不同国家语言实例
Dec 29 PHP
在Mac OS下搭建LNMP开发环境的步骤详解
Mar 10 PHP
Yii2压缩PHP中模板代码的输出问题
Aug 28 PHP
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
Feb 25 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+memcache实现的网站在线人数统计代码
2014/07/04 PHP
PHP生成随机数的方法实例分析
2015/01/22 PHP
Yii快速入门经典教程
2015/12/28 PHP
PHP中关键字interface和implements详解
2017/06/14 PHP
PHP实现的策略模式简单示例
2017/08/25 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
arguments对象
2006/11/20 Javascript
javascript动态向网页中添加表格实现代码
2014/02/19 Javascript
通过JQuery将DIV的滚动条滚动到指定的位置方便自动定位
2014/05/05 Javascript
解决bootstrap导航栏navbar在IE8上存在缺陷的方法
2016/07/01 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
2016/10/10 Javascript
jQuery select自动选中功能实现方法分析
2016/11/28 Javascript
jQuery实现可拖拽3D万花筒旋转特效
2017/01/03 Javascript
javascript 初学教程及五子棋小程序的简单实现
2017/07/04 Javascript
浅谈NodeJs之数据库异常处理
2017/10/25 NodeJs
详解微信小程序图片地扯转base64解决方案
2019/08/18 Javascript
JS面向对象编程基础篇(三) 继承操作实例详解
2020/03/03 Javascript
[02:07]DOTA2超级联赛专访BBC:难忘网吧超神经历
2013/06/09 DOTA
python实现画圆功能
2018/01/25 Python
如何用Python来理一理红楼梦里的那些关系
2019/08/14 Python
tensorflow模型继续训练 fineturn实例
2020/01/21 Python
python 获取当前目录下的文件目录和文件名实例代码详解
2020/03/10 Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
2020/04/27 Python
Pycharm快捷键配置详细整理
2020/10/13 Python
实例教程 一款纯css3实现的数字统计游戏
2014/11/10 HTML / CSS
浅谈html5与APP混合开发遇到的问题总结
2018/03/20 HTML / CSS
h5网页水印SDK的实现代码示例
2019/02/19 HTML / CSS
Linux管理员面试题 Linux admin interview questions
2016/07/08 面试题
有abstract方法的类一定要用abstract修饰吗
2016/03/14 面试题
项目专员岗位职责
2013/12/04 职场文书
2014年五四青年节演讲稿范文
2014/04/22 职场文书
反邪教宣传工作方案
2014/05/07 职场文书
员工年终自我评价
2014/09/14 职场文书
致创业您:正能量激励人心句子(48条)
2019/08/15 职场文书
sql server删除前1000行数据的方法实例
2021/08/30 SQL Server
Mysql分库分表之后主键处理的几种方法
2022/02/15 MySQL