标题:原创PHP上传类 瑞意上传类
只看楼主
rainic
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2367
专家分:0
注 册:2005-8-9
 问题点数:0 回复次数:6 
原创PHP上传类 瑞意上传类
本人原创的PHP文件上传类。
有如下主要功能:
1. 单个上传、批量上传
2. 上传文件大小限制
3. 上传文件扩展名限制
4. 上传文件类型限制
5. 自动创建上传目标目录
6. 自动以时间重命名上传文件
7. 上传结果返回

下载地址:
http://www.
搜索更多相关主题的帖子: PHP 
2008-10-15 19:06
知道不知道
Rank: 1
等 级:新手上路
威 望:2
帖 子:183
专家分:0
注 册:2008-10-4
得分:0 


程序代码:
<?
//类名: RUpload 瑞意上传类
//Create By Rain, Jan 20 2007
//Update By Rain, Oct 10 2008
//Copyright @  

class RUpload {
    var $max_file_size; //当不大于0时,表示上传文件大小只受服务器配置的上传文件大小限制
    var $accept_type = ""; //for example: set_accept_type("image|audio|video")
    var $refuse_type = ""; //for example: set_refuse_type("application|text")
    var $accept_ext = ""; //for example: set_accept_ext("jpg|gif|png|mp3|wma")
    var $refuse_ext = ""; //for example: set_refuse_ext("php|asp|aspx|jsp|exe|com)"
    var $error = 0; //0:无错误 1:上传失败 2:文件已存在(不覆盖模式上传) 3:非法的文件类型 4:非法的文件扩展名 5:文件大小为零或超出限制 6:创建目录失败
    
    //构造函数 参数: 单个文件大小限制, 允许的扩展名, 拒绝的扩展名, 允许的类型, 拒绝的类型
    function RUpload($max_file_size = 0, $accept_ext = '', $refuse_ext = '', $accept_type = '', $refuse_type = '') {
        $this->max_file_size = $max_file_size <= 0 ? (int)ini_get('upload_max_filesize') * 1048576 : $max_file_size;
        $this->set_accept_ext($accept_ext);
        $this->set_refuse_ext($refuse_ext);
        $this->set_accept_type($accept_type);
        $this->set_refuse_type($refuse_type);
    }
        
    //把表单中存在的文件全部上传保存到$upload_dir,不改文件名 $overwrite=1时,文件名相同,覆盖原文件
    function save($upload_dir = '', $overwrite = 1) {
        $upload_dir = $this->set_upload_dir($upload_dir);
        $i = 0;
        foreach ($_FILES as $file) {
            $is_ok[$i]['src'] = $file['name'];
            $is_ok[$i]['dst'] = false;
            if ($this->check_file_size($file) && $this->check_file_type($file) && $this->check_file_ext($file)) {
                if ($overwrite || !file_exists($upload_dir . $file['name']))
                    if (move_uploaded_file($file['tmp_name'], $upload_dir . $file['name'])) {
                        $is_ok[$i]['src'] = $file['name'];
                        $is_ok[$i]['dst'] = $file['name'];
                    }
                    else {
                        $this->error = 1; 
                    }
                else {
                    $this->error = 2;
                }
            }
            $i++;
        }
        return $is_ok;
    }
    
    //把表单中存在的文件全部上传保存到$upload_dir,文件名以当前时间命名 $overwrite=1时,文件名相同,覆盖原文件
    //返回上传结果数组
    function save_as_timestr($upload_dir = '', $overwrite = 1) {
        $upload_dir = $this->set_upload_dir($upload_dir);
        $i = 0;
        $j = 0;
        foreach ($_FILES as $file) {
            $is_ok[$j]['src'] = $file['name'];
            $is_ok[$j]['dst'] = false;
            if ($this->check_file_size($file) && $this->check_file_type($file) && $this->check_file_ext($file)) {
                if ($overwrite || !file_exists($upload_dir . $file['name'])) {
                    if (!$i) {
                        list($usec) = explode(' ', microtime());
                        $usec = substr($usec, 2, 6);
                        $file_name = date("ymdHis") . $usec;
                    }
                    $full_file_name = $file_name . "_" . $i . "." . $this->get_file_ext($file['name']);
                    if (move_uploaded_file($file['tmp_name'], $upload_dir . $full_file_name)) {
                        $is_ok[$j]['src'] = $file['name'];
                        $is_ok[$j]['dst'] = $full_file_name;
                    }
                    else {
                        $this->error = 1;
                    }
                    $i++;
                }
                else {
                    $this->error = 2;
                }
            }
            $j++;
        }
        return $is_ok;
    }
    
    //把表单中文件域为$form_file的文件上传保存到目录$upload_dir,不改文件名 $overwrite=1时,文件名相同,覆盖原文件,返回true or false
    function file_save($form_file, $upload_dir = '', $overwrite = 1) {
        return $this->file_save_as($form_file, $_FILES[$form_file]['name'], $upload_dir, $overwrite);
    }
    
    //把表单中文件域为$form_file的文件上传保存到目录$upload_dir,文件名以当前时间命名 $overwrite=1时,文件名相同,覆盖原文件,返回文件名,失败返回false
    function file_save_as_timestr($form_file, $upload_dir = '', $overwrite = 1) {
        list($usec) = explode(' ', microtime());
        $usec = substr($usec, 2, 6);
        $full_file_name = date("ymdHis") . "$usec." . $this->get_file_ext($_FILES[$form_file]['name']);
        if ($this->file_save_as($form_file, $full_file_name, $upload_dir, $overwrite))
            return $full_file_name;
        else
            return false;
    }
    
    //把表单中文件域为$form_file的文件上传保存到目录$upload_dir,文件名为$file_name $overwrite=1时,文件名相同,覆盖原文件,返回true or false
    function file_save_as($form_file, $file_name, $upload_dir = '', $overwrite = 1) {
        $upload_dir = $this->set_upload_dir($upload_dir);
        $is_ok = false;
        $file = $_FILES[$form_file];
        if ($this->check_file_size($file) && $this->check_file_type($file) && $this->check_file_ext($file)) {
            if ($overwrite || !file_exists($upload_dir . $file_name)) {
                if (move_uploaded_file($file['tmp_name'], $upload_dir . $file_name))
                    $is_ok = true;
                else
                    $this->error = 1;
            }
            else {
                $this->error = 2;
            }
        }
        return $is_ok;
    }
    
    function set_refuse_type($refuse_type) { //设置不允许的文件类型
        $this->refuse_type = $this->my_preg_replace($refuse_type);
    }
    function set_accept_type($accept_type) { //设置允许的文件类型
        $this->accept_type = $this->my_preg_replace($accept_type);
    }
    
    function set_refuse_ext($refuse_ext) { //设置不允许的文件扩展名
        $this->refuse_ext = $this->my_preg_replace($refuse_ext);
    }
    function set_accept_ext($accept_ext) { //设置允许的文件扩展名
        $this->accept_ext = $this->my_preg_replace($accept_ext);
    }
    
    function set_max_file_size($max_file_size) { //设置单个文件大小限制(字节)
        $this->max_file_size = $max_file_size;
    }
    
    function get_error_code() {//获取最后的错误代码
        return $this->error;
    }
    function get_error() { //获取最后的错误信息
        switch ($this->error) {
            case 0:
                $str_err = "没有错误"; break;
            case 1:
                $str_err = "上传失败"; break;
            case 2:
                $str_err = "文件已存在"; break;
            case 3:
                $str_err = "非法的文件类型"; break;
            case 4:
                $str_err = "非法的文件扩展名"; break;
            case 5:
                $str_err = "文件大小为零或超出限制" . ($this->max_file_size / 1024) . "K"; break;
            case 6:
                $str_err = "创建目录失败"; break;
        }
        return "错误" . $this->error . ":{$str_err}。";
    }
    function print_error() { //打印最后的错误信息
        echo $this->get_error();
    }
    
    function get_file_type($file_type) { //获取文件类型
        $i = strrpos($file_type, "/");
        if ($i > 0)
            return substr($file_type, 0, $i);
        else
            return "";
    }
    
    function get_file_ext($file_name) { //获取文件扩展名
        $i = strrpos($file_name, ".");
        if ($i > 0)
            return substr($file_name, $i + 1);
        else
            return "";
    }
    
    function get_file_size($form_file) { //获取文件域对应文件大小
        return     $_FILES[$form_file]['size'];
    }
    function get_all_file_size($form_file) { //获取上传表单中全部文件大小
        $i = 0;
        foreach ($_FILES as $file) {
            $all_file_size[$i] = $file['size'];
            $i++;
        }
        return $all_file_size;
    }
    
    function get_file_name($form_file) { //获取文件域对应文件名
        return $_FILES[$form_file]['name'];
    }
    function get_all_file_name() { //获取上传表单中全部文件名
        $i = 0;
        foreach ($_FILES as $file) {
            $all_file_name[$i] = $file['name'];
            $i++;
        }
        return $all_file_name;
    }
    
    //以下的protected型方法,最好不要在外部调用
    
    function check_file_type($file) { //检查文件类型是否被允许
        if ($this->accept_type != "") {
            if (!preg_match($this->accept_type, $this->get_file_type($file['type']))) {
                $this->error = 3;
                return false;
            }
        }
        if ($this->refuse_type != "") {
            if (preg_match($this->refuse_type, $this->get_file_type($file['type']))) {
                $this->error = 3;
                return false;
            }    
        }
        return true;
    }
    function check_file_ext($file) { //检查文件扩展名是否被允许
        if ($this->accept_ext != "") {
            if (!preg_match($this->accept_ext, $this->get_file_ext($file['name']))) {
                $this->error = 4;
                return false;
            }
        }
        if ($this->refuse_ext != "") {
            if (preg_match($this->refuse_ext, $this->get_file_ext($file['name']))) {
                $this->error = 4;
                return false;
            }
        }
        return true;
    }
    function check_file_size($file) { //检查文件大小是否超出限制
        if ($file['size'] > 0) {
            if ($this->max_file_size > 0) {
                if ($file['size'] > $this->max_file_size) {
                    $this->error = 5;
                    return false;
                }
            }
            return true;
        }
        else {
            $this->error = 5;
            return false;
        }
    }
    
    function my_preg_replace($str){ //替换成正则表达式
        $str = trim($str);
        if ($str) {
            $str = preg_replace("/\b/", "\b", $str);
            $str = "/" . $str . "/i";
        }
        return $str;
    }
    
    function set_upload_dir($upload_dir) { //格式化并创建上传目录
        //格式化目录
        $upload_dir = preg_replace("/[\\\\\/]+/", '/', trim($upload_dir));
        if ($upload_dir) {
            /*if (preg_match("/^\.{0,2}\//", $upload_dir))
                $upload_dir = './' . $upload_dir;
            */
            if (substr($upload_dir, -1) != '/')
                $upload_dir .= '/';
            
            if (preg_match("/^[\.\/]+$/", $upload_dir))
                return $upload_dir;
        }
        else if ($upload_dir === '0') {
            $upload_dir = './0/';
        }
        else {
            return './';
        }
        
        //创建目录
        $arr_dir = explode('/', $upload_dir);
        $dir_tmp = '';
        foreach ($arr_dir as $en) {
            $dir_tmp .= $en . '/';
            if (!file_exists($dir_tmp)) {
                if (!@mkdir($dir_tmp)) {
                    $this->error = 6;
                    return false;
                }
            }
        }
        return $upload_dir;
    }
}
?>

<?
//######## 测试 ########
/*
if ($_FILES) {
    $upload = new RUpload();
    print_r($upload->save_as_timestr('rupload/')); //批量上传
    //print_r($upload->file_save_as_timestr('fileField1')); //单个上传
    $upload->print_error();
}

echo '<form enctype="multipart/form-data" method="post" action="">
  <input type="file" name="fileField0" /><br />
  <input type="file" name="fileField1" /><br />
  <input type="file" name="fileField2" /><br />
  <input type="submit" value="提交" />
</form>';
*/
?>
2008-10-15 23:05
知道不知道
Rank: 1
等 级:新手上路
威 望:2
帖 子:183
专家分:0
注 册:2008-10-4
得分:0 
很精悍,至少不像别的类几千行的代码,让我看下去的信心都没了
2008-10-15 23:07
luo123
Rank: 1
等 级:新手上路
威 望:2
帖 子:324
专家分:0
注 册:2007-4-13
得分:0 
收藏了

[url=http://www..cn]电子编程[/url]
2008-10-16 19:41
SkyGull
Rank: 5Rank: 5
来 自:浙江杭州
等 级:贵宾
威 望:13
帖 子:839
专家分:324
注 册:2007-6-7
得分:0 
顶上~~~~~~~~~~~~~~~~~~
2008-10-20 08:48
free_abc
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2010-1-30
得分:0 
多谢,收藏学习了!!
2010-01-30 17:02
kissplay
Rank: 2
等 级:论坛游民
帖 子:15
专家分:10
注 册:2010-1-31
得分:0 
收下了,不过没有使用过
2010-02-01 17:01



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-238479-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.601351 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved