文件上传类


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_Flame(Version:Progress)的原代码
Oct 09 PHP
用phpmyadmin更改mysql5.0登录密码
Mar 25 PHP
上传文件先创建目录 再上传到目录里面去
Dec 29 PHP
详解PHP中strlen和mb_strlen函数的区别
Mar 07 PHP
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
Jul 04 PHP
php设计模式之单例模式代码
Jun 11 PHP
zen cart实现订单中增加paypal中预留电话的方法
Jul 12 PHP
php版微信公众平台之微信网页登陆授权示例
Sep 23 PHP
PHP实现的mysql主从数据库状态检测功能示例
Jul 20 PHP
在Laravel中使用DataTables插件的方法
May 29 PHP
PHP实现的多维数组去重操作示例
Jul 21 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
Jul 06 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
YII实现分页的方法
2014/07/09 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
2019/05/29 PHP
仿迅雷焦点广告效果(JQuery版)
2008/11/19 Javascript
百度 popup.js 完美修正版非常的不错 脚本之家推荐
2009/04/17 Javascript
html 锁定页面(js遮罩层弹出div效果)
2009/10/27 Javascript
简介AngularJS中$http服务的用法
2016/02/06 Javascript
Boostrap模态窗口的学习小结
2016/03/28 Javascript
全面介绍javascript实用技巧及单竖杠
2016/07/18 Javascript
利用BootStrap弹出二级对话框的简单实现方法
2016/09/21 Javascript
js实现拖拽上传图片功能
2017/08/01 Javascript
Vue.js devtool插件安装后无法使用的解决办法
2017/11/27 Javascript
vue-cli安装使用流程步骤详解
2018/11/08 Javascript
Angular6使用forRoot() 注册单一实例服务问题
2019/08/27 Javascript
[01:11:37]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第一场 11.19
2020/11/19 DOTA
python实现的解析crontab配置文件代码
2014/06/30 Python
python进阶教程之异常处理
2014/08/30 Python
对python过滤器和lambda函数的用法详解
2019/01/21 Python
python爬虫 Pyppeteer使用方法解析
2019/09/28 Python
python pip安装包出现:Failed building wheel for xxx错误的解决
2019/12/25 Python
Python调用REST API接口的几种方式汇总
2020/10/19 Python
详解Css3新特性应用之过渡与动画
2017/01/10 HTML / CSS
深入浅析css3 border-image边框图像详解
2015/11/24 HTML / CSS
玩具反斗城天猫官方旗舰店:享誉全球的玩具店
2017/10/10 全球购物
获取邓白氏信用报告:Dun & Bradstreet
2019/01/22 全球购物
W Hamond官网:始于1979年的钻石专家
2020/07/20 全球购物
怎样声明接口
2014/09/19 面试题
加拿大探亲邀请信
2014/01/28 职场文书
火车的故事教学反思
2014/02/11 职场文书
化学教学随笔感言
2014/02/19 职场文书
诚信考试倡议书
2014/04/15 职场文书
新颖的化妆品活动方案
2014/08/21 职场文书
兼职安全员岗位职责
2015/02/15 职场文书
golang slice元素去重操作
2021/04/30 Golang
python opencv将多个图放在一个窗口的实例详解
2022/02/28 Python
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
2022/04/04 Python
利用nginx搭建RTMP视频点播、直播、HLS服务器
2022/05/25 Servers