文件上传类


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
自动跳转中英文页面
Oct 09 PHP
php cli 方式 在crotab中运行解决
Feb 08 PHP
PHP 手机归属地查询 api
Feb 08 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
Aug 18 PHP
php常用文件操作函数汇总
Nov 22 PHP
php使用unset()删除数组中某个单元(键)的方法
Feb 17 PHP
微信获取用户地理位置信息的原理与步骤
Nov 12 PHP
PHP数组函数array_multisort()用法实例分析
Apr 02 PHP
PHP读取文本文件并逐行输出该行使用最多的字符与对应次数的方法
Nov 25 PHP
PHP 进度条函数的简单实例
Sep 19 PHP
Ajax中的JSON格式与php传输过程全面解析
Nov 14 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实现阿拉伯数字和罗马数字相互转换的方法
2015/04/17 PHP
PHP基于curl模拟post提交json数据示例
2018/06/22 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
js验证表单第二部分
2006/11/25 Javascript
从Ajax到JQuery Ajax学习
2007/02/14 Javascript
javascript第一课
2007/02/27 Javascript
JavaScript 对象成员的可见性说明
2009/10/16 Javascript
基于Jquery的动态添加控件并取值的实现代码
2010/09/24 Javascript
用js实现控件的隐藏及style.visibility的使用
2013/06/14 Javascript
jquery 漂亮的删除确认和提交无刷新删除示例
2013/11/13 Javascript
jquery选择器使用详解
2014/04/08 Javascript
jQuery实现点击该行即可删除HTML表格行
2014/10/17 Javascript
JS实现向表格行添加新单元格的方法
2015/03/30 Javascript
javascript中返回顶部按钮的实现
2015/05/05 Javascript
JQuery判断checkbox是否选中及其它复选框操作方法合集
2015/06/01 Javascript
学习JavaScript设计模式之责任链模式
2016/01/18 Javascript
一起学写js Calender日历控件
2016/04/14 Javascript
解决bootstrap下拉菜单点击立即隐藏bug的方法
2017/06/13 Javascript
[02:36]DOTA2英雄基础教程 帕格纳
2014/01/20 DOTA
Python版的文曲星猜数字游戏代码
2013/09/02 Python
python Django模板的使用方法(图文)
2013/11/04 Python
python统计字符串中指定字符出现次数的方法
2015/04/04 Python
python高手之路python处理excel文件(方法汇总)
2016/01/07 Python
python2.7的编码问题与解决方法
2016/10/04 Python
Python实现通过文件路径获取文件hash值的方法
2017/04/29 Python
python出现&quot;IndentationError: unexpected indent&quot;错误解决办法
2017/10/15 Python
matplotlib 输出保存指定尺寸的图片方法
2018/05/24 Python
python读取一个目录下所有txt里面的内容方法
2018/06/23 Python
节日快乐! Python画一棵圣诞树送给你
2019/12/24 Python
布里斯班女装时尚品牌:Adrift
2017/12/28 全球购物
印尼极简主义和实惠的在线家具店:Fabelio
2019/03/27 全球购物
Brasty罗马尼亚:购买手表、香水、化妆品、珠宝
2020/04/21 全球购物
客房服务员岗位职责
2015/02/09 职场文书
学校少先队工作总结
2015/08/12 职场文书
php 原生分页
2021/04/01 PHP
Java详细解析==和equals的区别
2022/04/07 Java/Android