一个非常实用的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切割页面div内容的实现代码分享
Jul 31 PHP
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
Jun 23 PHP
IIS下PHP的三种配置方式对比
Nov 20 PHP
php生成shtml类用法实例
Dec 09 PHP
PHP将HTML转换成文本的实现代码
Jan 21 PHP
PHP实现加密的几种方式介绍
Feb 22 PHP
PHP使用第三方即时获取物流动态实例详解
Apr 27 PHP
PHP经典实用正则表达式小结
May 04 PHP
由php中字符offset特征造成的绕过漏洞详解
Jul 07 PHP
PHP观察者模式示例【Laravel框架中有用到】
Jun 15 PHP
PHP Trait代码复用类与多继承实现方法详解
Jun 17 PHP
PHP如何防止用户重复提交表单
Dec 09 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 程序授权验证开发思路
2009/07/09 PHP
PHP+原生态ajax实现的省市联动功能详解
2017/08/15 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
PHP设计模式之原型模式定义与用法详解
2018/04/03 PHP
Laravel框架文件上传功能实现方法示例
2019/04/16 PHP
用JavaScript脚本实现Web页面信息交互
2006/10/11 Javascript
写了一个layout,拖动条连贯,内容区可为iframe
2007/08/19 Javascript
Extjs EditorGridPanel中ComboBox列的显示问题
2011/07/04 Javascript
Js数组的操作push,pop,shift,unshift等方法详细介绍
2012/12/28 Javascript
单击按钮显示隐藏子菜单经典案例
2013/01/04 Javascript
js确认删除对话框效果的示例代码
2014/02/20 Javascript
整理AngularJS框架使用过程当中的一些性能优化要点
2016/03/05 Javascript
leaflet的开发入门教程
2016/11/17 Javascript
微信小程序 登陆流程详细介绍
2017/01/17 Javascript
vue.js学习之UI组件开发教程
2017/07/03 Javascript
Easyui Datagrid自定义按钮列(最后面的操作列)
2017/07/13 Javascript
js计算两个日期间的天数月的实例代码
2018/09/20 Javascript
Vue中控制v-for循环次数的实现方法
2018/09/26 Javascript
利用原生JavaScript实现造日历轮子实例代码
2019/05/08 Javascript
微信用户访问小程序的登录过程详解
2019/09/20 Javascript
使用Python实现简单的服务器功能
2017/08/25 Python
python出现&quot;IndentationError: unexpected indent&quot;错误解决办法
2017/10/15 Python
pytorch构建网络模型的4种方法
2018/04/13 Python
利用python打开摄像头及颜色检测方法
2018/08/03 Python
5款Python程序员高频使用开发工具推荐
2019/04/10 Python
django的分页器Paginator 从django中导入类
2019/07/25 Python
python正则表达式 匹配反斜杠的操作方法
2020/08/07 Python
在IE6系列等老式浏览器中使用HTML5的新标签实现方案
2012/12/25 HTML / CSS
西班牙灯具网上商店:Lampara.es
2018/06/05 全球购物
护士演讲稿优秀范文
2014/04/30 职场文书
市级青年文明号申报材料
2014/05/26 职场文书
机械工程及其自动化专业求职信
2014/08/08 职场文书
python关于集合的知识案例详解
2021/05/30 Python
Python 中的Sympy详细使用
2021/08/07 Python
HTML基本元素标签介绍
2022/02/28 HTML / CSS
MySQL索引失效场景及解决方案
2022/07/23 MySQL