一个非常实用的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 09 PHP
一个PHP的String类代码
Apr 20 PHP
PHP使用DirectoryIterator显示下拉文件列表的方法
Mar 13 PHP
smarty模板引擎之配置文件数据和保留数据
Mar 30 PHP
学习php设计模式 php实现状态模式
Dec 07 PHP
WordPress开发中用于获取近期文章的PHP函数使用解析
Jan 05 PHP
phpmailer绑定邮箱的实现方法
Dec 01 PHP
php 截取GBK文档某个位置开始的n个字符方法
Mar 08 PHP
PHP使用pdo实现事务处理操作示例
Sep 05 PHP
为Plesk PHP7启用Oracle OCI8扩展方法总结
Mar 29 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
Feb 29 PHP
PHP后门隐藏的一些技巧总结
Nov 04 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使用in_array函数检查数组中是否存在某个值
2015/03/25 PHP
JQuery从头学起第三讲
2010/07/06 Javascript
菜鸟javascript基础资料整理3 正则
2010/12/06 Javascript
JS 实现BASE64_ENCODE和BASE64_DECODE(实例代码)
2013/11/13 Javascript
jQuery中innerHeight()方法用法实例
2015/01/19 Javascript
jquery中trigger()无法触发hover事件的解决方法
2015/05/07 Javascript
详解javascript new的运行机制
2016/01/26 Javascript
jQuery动态添加与删除tr行实例代码
2016/10/18 Javascript
Bootstrap学习笔记之环境配置(1)
2016/12/07 Javascript
jquery实现转盘抽奖功能
2017/01/06 Javascript
React复制到剪贴板的示例代码
2017/08/22 Javascript
vue组件jsx语法的具体使用
2018/05/21 Javascript
js使用formData实现批量上传
2020/03/27 Javascript
微信小程序实现简单跑马灯效果
2020/05/26 Javascript
Ant Design Pro 下实现文件下载的实现代码
2019/12/03 Javascript
JavaScript setInterval()与setTimeout()计时器
2019/12/27 Javascript
JS前端广告拦截实现原理解析
2020/02/17 Javascript
JsonServer安装及启动过程图解
2020/02/28 Javascript
微信小程序实现身份证取景框拍摄
2020/09/09 Javascript
[02:35]DOTA2超级联赛专访XB 难忘一年九冠称王
2013/06/20 DOTA
[01:45]DOTA2众星出演!DSPL刀塔次级职业联赛宣传片
2014/11/21 DOTA
[32:17]完美世界DOTA2联赛循环赛LBZS vs Forest第二场 10月30日
2020/10/31 DOTA
Python利用pyHook实现监听用户鼠标与键盘事件
2014/08/21 Python
Python基础教程之利用期物处理并发
2018/03/29 Python
Python3多线程操作简单示例
2018/05/22 Python
Django 自动生成api接口文档教程
2019/11/19 Python
PyTorch中torch.tensor与torch.Tensor的区别详解
2020/05/18 Python
Django实现任意文件上传(最简单的方法)
2020/06/03 Python
土耳其玩具商店:Toyzz Shop
2019/08/02 全球购物
编程用JAVA解析XML的方式
2013/07/07 面试题
国际贸易专业个人求职信格式
2014/02/02 职场文书
《宿建德江》教学反思
2014/04/23 职场文书
质量月活动总结
2014/08/26 职场文书
检查机关党的群众路线个人整改措施
2014/10/04 职场文书
2014小学教师个人工作总结
2014/11/10 职场文书
2014年纠风工作总结
2014/12/08 职场文书