文件上传类


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&amp;&amp;mysql)四
Oct 09 PHP
我的论坛源代码(十)
Oct 09 PHP
PHP 实例化类的一点摘记
Mar 23 PHP
解析PHP中数组元素升序、降序以及重新排序的函数
Jun 20 PHP
在wamp集成环境下升级php版本(实现方法)
Jul 01 PHP
php函数间的参数传递(值传递/引用传递)
Sep 23 PHP
php实现图片文件与下载文件防盗链的方法
Nov 03 PHP
如何利用http协议发布博客园博文评论
Aug 03 PHP
joomla实现注册用户添加新字段的方法
May 05 PHP
PHP基于接口技术实现简单的多态应用完整实例
Apr 26 PHP
tp5(thinkPHP5框架)时间查询操作实例分析
May 29 PHP
laravel 解决强制跳转 https的问题
Oct 22 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
Zend公司全球首推PHP认证
2006/10/09 PHP
如何开发一个虚拟域名系统
2006/10/09 PHP
PHP迅雷、快车、旋风下载专用链转换代码
2010/06/15 PHP
用php实现选择排序的解决方法
2013/05/04 PHP
屏蔽Flash右键信息的js代码
2010/01/17 Javascript
复制小说文本时出现的随机乱码的去除方法
2010/09/07 Javascript
扩展javascript的Date方法实现代码(prototype)
2010/11/20 Javascript
JavaScript中document.forms[0]与getElementByName区别
2015/01/21 Javascript
js制作简易年历完整实例
2015/01/28 Javascript
微信小程序 定义全局数据、函数复用、模版等详细介绍
2016/10/27 Javascript
基于jQuery的checkbox全选问题分析
2016/11/18 Javascript
JavaScript和jQuery制作光棒效果
2017/02/24 Javascript
ES6正则的扩展实例详解
2017/04/25 Javascript
Vue应用部署到服务器的正确方式
2017/07/15 Javascript
Nginx 配置多站点vhost 的方法
2018/01/07 Javascript
fullpage.js最后一屏滚动方式
2018/02/06 Javascript
原生js+canvas实现验证码
2020/11/29 Javascript
[02:23]完美世界全国高校联赛街访DOTA2第一期
2019/11/28 DOTA
Python并发之多进程的方法实例代码
2018/08/15 Python
Django ORM 自定义 char 类型字段解析
2019/08/09 Python
如何基于Python + requests实现发送HTTP请求
2020/01/13 Python
Python3.6 中的pyinstaller安装和使用教程
2020/03/16 Python
jupyter note 实现将数据保存为word
2020/04/14 Python
浅谈keras中loss与val_loss的关系
2020/06/22 Python
Html5游戏开发之乒乓Ping Pong游戏示例(二)
2013/01/21 HTML / CSS
国际鲜花速递专家:Floraqueen
2016/11/24 全球购物
定义一结构体变量,用其表示点坐标,并输入两点坐标,求两点之间的距离
2015/08/17 面试题
系统管理员的职责包括那些?管理的对象是什么?
2016/09/20 面试题
客服专员岗位职责
2014/02/28 职场文书
广告语设计及教案
2014/03/21 职场文书
自主招生推荐信范文
2014/05/10 职场文书
尊老爱亲美德少年事迹材料
2014/08/14 职场文书
党的群众路线教育实践活动对照检查材料范文
2014/09/24 职场文书
广告设计专业毕业生自我鉴定
2014/09/27 职场文书
2014年计生协会工作总结
2014/11/21 职场文书
浅谈TypeScript 索引签名的理解
2021/10/16 Javascript