文件上传类


Posted in PHP onOctober 09, 2006

使用示例:
upload.php
<?php
include_once "upload.class.php";
if ($Submit != '')
{
    $fileArr['file'] = $file;
    $fileArr['name'] = $file_name;
    $fileArr['size'] = $file_size;
    $fileArr['type'] = $file_type;
    /** 所允许上传的文件类型 */
    $filetypes = array('gif','jpg','jpge','png');
    /** 文件上传目录 */
    $savepath = "/usr/htdocs/upload/";
    /** 没有最大限制 0 无限制*/
    $maxsize = 0;
    /** 覆盖 0 不允许  1 允许 */
    $overwrite = 0;
    $upload = new upload($fileArr, $file_name, $savepath, $filetypes, $overwrite, $maxsize);
    if (!$upload->run())
    {
     echo  "上传失败".$upload->errmsg();
    }
}
?>
<html>
<head>
<title>文件上传</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>

<body bgcolor="#FFFFFF" text="#000000">
<form name="form1" enctype="multipart/form-data" method="post" action="">
  <input type="file" name="file">
  <input type="submit" name="Submit" value="Submit">
</form>
</body>
</html>

上传类
upload.class.php

<?php
//
// +----------------------------------------------------------------------+
// | 文件上传                                                             
|// | 本代码仅供学习讨论之用,允许随意修改                                 
|// | Author: whxbb(whxbb@21cn.com)                                        
|// +----------------------------------------------------------------------+
//
// $Id: upload.class.php,v 1.0 2001/10/14 14:06:57 whxbb Exp $
//

$UPLOAD_CLASS_ERROR = array( 1 => '不允许上传该格式文件',
                             2 => '目录不可写',
                             3 => '文件已存在',
                             4 => '不知名错误',
                             5 => '文件太大'
                            );

/**
* Purpose
* 文件上传
*
* Example
*
    $fileArr['file'] = $file;
    $fileArr['name'] = $file_name;
    $fileArr['size'] = $file_size;
    $fileArr['type'] = $file_type;
    // 所允许上传的文件类型
    $filetypes = array('gif','jpg','jpge','png');
    // 文件上传目录
    $savepath = "/usr/htdocs/upload/";
    // 没有最大限制 0 无限制
    $maxsize = 0;
    // 覆盖 0 不允许  1 允许
    $overwrite = 0;
    $upload = new upload($fileArr, $file_name, $savepath, $filetypes, $overwrite, $maxsize);
    if (!$upload->run())
    {
     echo   $upload->errmsg();
    }
*
* @author whxbb(whxbb@21cn.com)
* @version 0.1
*/
class upload
{
    var $file;
    var $file_name;
    var $file_size;
    var $file_type;

    /** 保存名 */
    var $savename;
    /** 保存路径 */
    var $savepath;
    /** 文件格式限定 */
    var $fileformat = array();
    /** 覆盖模式 */
    var $overwrite = 0;
    /** 文件最大字节 */
    var $maxsize = 0;
    /** 文件扩展名 */
    var $ext;
    /** 错误代号 */
    var $errno;

    /**
     * 构造函数
     * @param $fileArr 文件信息数组 'file' 临时文件所在路径及文件名
                                    'name' 上传文件名
                                    'size' 上传文件大小
                                    'type' 上传文件类型
     * @param savename 文件保存名
     * @param savepath 文件保存路径
     * @param fileformat 文件格式限制数组
     * @param overwriet 是否覆盖 1 允许覆盖 0 禁止覆盖
     * @param maxsize 文件最大尺寸
     */
    function upload($fileArr, $savename, $savepath, $fileformat, $overwrite = 0, $maxsize = 0) {
        $this->file = $fileArr['file'];
        $this->file_name = $fileArr['name'];
        $this->file_size = $fileArr['size'];
        $this->file_type = $fileArr['type'];

        $this->get_ext();
        $this->set_savepath($savepath);
        $this->set_fileformat($fileformat);
        $this->set_overwrite($overwrite);
        $this->set_savename($savename);
        $this->set_maxsize($maxsize);
    }

    /** 上传  */
    function run()
    {
        /** 检查文件格式 */
        if (!$this->validate_format())
        {
            $this->errno = 1;
            return false;
        }
        /** 检查目录是否可写 */
        if(!@is_writable($this->savepath))
        {
            $this->errno = 2;
            return false;
        }
        /** 如果不允许覆盖,检查文件是否已经存在 */
        if($this->overwrite == 0 && @file_exists($this->savepath.$this->savename))
        {
            $this->errno = 3;
            return false;
        }
        /** 如果有大小限制,检查文件是否超过限制 */
        if ($this->maxsize != 0 )
        {
            if ($this->file_size > $this->maxsize)
            {
                $this->errno = 5;
                return false;
            }
        }
        /** 文件上传 */
       if(!@copy($this->file, $this->savepath.$this->savename))
       {
            $this->errno = 4;
            return false;
       }
       /** 删除临时文件 */
       $this->destory();
       return true;
    }

    /**
     * 文件格式检查
     * @access protect
     */
    function validate_format()
    {

        if (!is_array($this->fileformat))  // 没有格式限制
            return true;
       $ext = strtolower($this->ext);
        reset($this->fileformat);
        while(list($var, $key) = each($this->fileformat))
        {
            if (strtolower($key) == $ext)
                return true;
        }
        reset($this->fileformat);
        return false;
    }

    /**
     * 获取文件扩展名
     * access public
     */
    function get_ext()
    {
        $ext = explode(".", $this->file_name);
        $ext = $ext[count($ext) - 1];
        $this->ext = $ext;
    }
    /**
     * 设置上传文件的最大字节限制
     * @param $maxsize 文件大小(bytes) 0:表示无限制
     * @access public
     */
    function set_maxsize($maxsize)
    {
        $this->maxsize = $maxsize;
    }

    /**
     * 设置覆盖模式
     * @param 覆盖模式 1:允许覆盖 0:禁止覆盖
     * @access public
     */
    function set_overwrite($overwrite)
    {
        $this->overwrite = $overwrite;
    }

    /**
     * 设置允许上传的文件格式
     * @param $fileformat 允许上传的文件扩展名数组
     * @access public
     */
    function set_fileformat($fileformat)
    {
        $this->fileformat = $fileformat;
    }

    /**
     * 设置保存路径
     * @param $savepath 文件保存路径:以 "/" 结尾
     * @access public
     */
    function set_savepath($savepath)
    {
        $this->savepath = $savepath;
    }
    /**
     * 设置文件保存名
     * @savename 保存名,如果为空,则系统自动生成一个随机的文件名
     * @access public
     */
    function set_savename($savename)
    {
        if ($savename == '')  // 如果未设置文件名,则生成一个随机文件名
        {
            srand ((double) microtime() * 1000000);
            $rnd = rand(100,999);
            $name = date('Ymdhis') + $rnd;
            $name = $name.".".$this->ext;
        } else {
            $name = $savename;
        }
        $this->savename = $name;
    }
    /**
     * 删除文件
     * @param $file 所要删除的文件名
     * @access public
     */
    function del($file)
    {
        if(!@unlink($file))
        {
            $this->errno = 3;
            return false;
        }
        return true;
    }
    /**
     * 删除临时文件
     * @access proctect
     */
    function destory()
    {
        $this->del($this->file);
    }

    /**
     * 得到错误信息
    * @access public
      * @return error msg string or false
     */
    function errmsg()
    {
        global $UPLOAD_CLASS_ERROR;

        if ($this->errno == 0)
            return false;
        else
            return $UPLOAD_CLASS_ERROR[$this->errno];
    }
}
?>

PHP 相关文章推荐
一个php作的文本留言本的例子(三)
Oct 09 PHP
PHP的substr_replace将指定两位置之间的字符替换为*号
May 04 PHP
jQuery中的RadioButton,input,CheckBox取值赋值实现代码
Feb 18 PHP
php过滤所有恶意字符(批量过滤post,get敏感数据)
Mar 18 PHP
ECSHOP在PHP5.5及高版本上报错的解决方法
Aug 31 PHP
ThinkPHP模板循环输出Volist标签用法实例详解
Mar 23 PHP
简单概括PHP的字符串中单引号与双引号的区别
May 07 PHP
PHP进行批量任务处理不超时的解决方法
Jul 11 PHP
PHP封装的XML简单操作类完整实例
Nov 13 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
Jun 06 PHP
如何让PHP编码更加好看利于阅读
May 12 PHP
Thinkphp极验滑动验证码实现步骤解析
Nov 24 PHP
多文件上载系统完整版
Oct 09 #PHP
php中文件上传的安全问题
Oct 09 #PHP
ftp类(example.php)
Oct 09 #PHP
PHP概述.
Oct 09 #PHP
PHP安装问题
Oct 09 #PHP
提问的智慧
Oct 09 #PHP
DOMXML函数笔记
Oct 09 #PHP
You might like
PHP date()函数警告: It is not safe to rely on the system解决方法
2014/08/20 PHP
分享十款最出色的PHP安全开发库中文详细介绍
2015/03/22 PHP
PHP命名空间简单用法示例
2018/12/28 PHP
关于jQuery中的end()使用方法
2011/07/10 Javascript
Javascript 多浏览器兼容总结(实战经验)
2013/10/30 Javascript
jquery(hide方法)隐藏指定元素实例
2013/11/11 Javascript
返回顶部按钮响应滚动且动态显示与隐藏
2014/10/14 Javascript
浅谈JavaScript中的string拥有方法的原因
2015/08/28 Javascript
json定义及jquery操作json的方法
2016/10/03 Javascript
jQuery EasyUI 选项卡面板tabs的使用实例讲解
2017/12/25 jQuery
基于Vue-cli快速搭建项目的完整步骤
2018/11/03 Javascript
详解IOS微信上Vue单页面应用JSSDK签名失败解决方案
2018/11/14 Javascript
JavaScript解析及序列化JSON的方法实例分析
2019/01/04 Javascript
React+Antd+Redux实现待办事件的方法
2019/03/14 Javascript
Layui 导航默认展开和菜单栏选中高亮设置的方法
2019/09/04 Javascript
JavaScript代码模拟鼠标自动点击事件示例
2020/08/07 Javascript
基于vue与element实现创建试卷相关功能(实例代码)
2020/12/07 Vue.js
[01:25]DOTA2超级联赛专访iG 将调整状态找回自己
2013/06/05 DOTA
python获取各操作系统硬件信息的方法
2015/06/03 Python
Python实现序列化及csv文件读取
2020/01/19 Python
Office DEPOT法国官网:欧迪办公用品采购
2018/01/03 全球购物
JD Sports德国官网:英国领先的运动鞋和运动服饰零售商
2018/02/26 全球购物
大学生工作推荐信范文
2013/12/02 职场文书
青春寄语大全
2014/04/09 职场文书
《水上飞机》教学反思
2014/04/10 职场文书
爱国演讲稿500字
2014/05/04 职场文书
省级优秀毕业生主要事迹
2014/05/29 职场文书
服务行业口号
2014/06/11 职场文书
交通安全横幅标语
2014/10/07 职场文书
出差报告范文
2014/11/06 职场文书
2014年销售工作总结
2014/12/01 职场文书
民主评议党员个人自我评价
2015/03/03 职场文书
检察院起诉意见书
2015/05/20 职场文书
暑期辅导班宣传单
2015/07/14 职场文书
Go使用协程交替打印字符
2021/04/29 Golang
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
2022/01/22 MySQL