一个非常实用的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 header Content-Type类型小结
Jul 03 PHP
详解php的魔术方法__get()和__set()使用介绍
Sep 19 PHP
深入理解PHP几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
Jun 06 PHP
PHP将两个关联数组合并函数提高函数效率
Mar 18 PHP
laravel 5 实现模板主题功能(续)
Mar 02 PHP
PHP curl使用实例
Jul 02 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
Dec 19 PHP
php封装的图片(缩略图)处理类完整实例
Oct 19 PHP
PHP使用Nginx实现反向代理
Sep 20 PHP
thinkPHP框架实现的无限回复评论功能示例
Jun 09 PHP
PHP 二维array转换json的实例讲解
Aug 21 PHP
七种PHP开发环境搭建工具
Jun 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学习笔记之 函数声明(二)
2011/06/09 PHP
PHP获取表单所有复选框的值的方法
2014/08/28 PHP
php计算两个坐标(经度,纬度)之间距离的方法
2015/04/17 PHP
php验证码实现代码(3种)
2015/09/07 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
2015/12/31 PHP
PHP读取大文件的多种方法介绍
2016/04/04 PHP
PHP仿微信多图片预览上传实例代码
2016/09/13 PHP
PHP连接MySQL数据库三种实现方法
2020/12/10 PHP
JQuery 插件模板 制作jquery插件的朋友可以参考下
2010/03/17 Javascript
JQuery+JS实现仿百度搜索结果中关键字变色效果
2011/08/02 Javascript
javascript中有趣的反柯里化深入分析
2012/12/05 Javascript
jquery ui bootstrap 实现自定义风格
2014/11/14 Javascript
JQuery简单实现锚点链接的平滑滚动
2015/05/03 Javascript
微信小程序 video组件详解
2016/10/25 Javascript
基于Nodejs利用socket.io实现多人聊天室
2017/02/22 NodeJs
vue2.0父子组件间通信的实现方法
2017/04/19 Javascript
Vue上传组件vue Simple Uploader的用法示例
2017/08/25 Javascript
Vue实现web分页组件详解
2017/11/28 Javascript
关于Vue中axios的封装实例详解
2019/10/20 Javascript
[01:19:35]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第二局
2016/03/05 DOTA
Python字符串逐字符或逐词反转方法
2015/05/21 Python
Python实现的彩票机选器实例
2015/06/17 Python
玩转python selenium鼠标键盘操作(ActionChains)
2020/04/12 Python
启动targetcli时遇到错误解决办法
2017/10/26 Python
python3.6+opencv3.4实现鼠标交互查看图片像素
2018/02/26 Python
Python中if elif else及缩进的使用简述
2018/05/31 Python
原生python实现knn分类算法
2019/10/24 Python
python飞机大战pygame游戏背景设计详解
2019/12/17 Python
AUC计算方法与Python实现代码
2020/02/28 Python
三星英国官网:Samsung英国
2018/09/25 全球购物
自荐信如何制作?
2014/02/21 职场文书
商务专员岗位职责范本
2014/06/29 职场文书
节约每一滴水演讲稿
2014/09/09 职场文书
人事主管岗位职责
2015/02/04 职场文书
护士自我推荐信范文
2015/03/24 职场文书
用Python实现Newton插值法
2021/04/17 Python