+ -
当前位置:首页 → 问答吧 → ★再共享一个最方便的文件上传类★

★再共享一个最方便的文件上传类★

时间:2006-12-23

来源:互联网

有时候项目中经常有一次上传多个文件的的需要,在网上找了一下,没有找到很方便的,于是写了一个,最能适合这种上次上传多个文件的情况了
当然对上传单个文件就更不用说了,希望大家能喜欢!!  :)
复制PHP内容到剪贴板
PHP代码:
/*
     @名称:UPLOAD_CLASS
     @功能:上传文件,可以是单个文件式或数组式
     @作者:袁维
     @版本:V1.0
     @时间:2006-12-3
*/
 class UPLOAD_CLASS
 {
     var $fexts='*';        //允许上传的文件扩展名集合,"*":表示任何文件;格式为:".jpg|.swf|.png"
     var $max_size=0;       //允许的最大文件大小,单位以K. 0:表示任何大小
     var $is_del=false;     //当目标文件存在时是否删除
     var $uploaded_file=''; //已上传成功的文件名,多个用","隔开
     var $input_name;       //FILE控件名称
     /* 功能:构造函数 
        参数:$input_name:表单中FILE控件名称,如 <input type="file" name="upfile"> 中的"upfile"
                         也可以控件是数组,如   <input type="file" name="up_file[]">
                                              <input type="file" name="up_file[]">
     */
     function UPLOAD_CLASS($input_name='')
     {
         if($input_name == '')
         {
            echo '<b>UPLOAD_CLASS类构造出错:请指定表单中FILE控件的名称!如: $up = new UPLOAD_CLASS("up_file");</b>';
         }
         $this->input_name = $input_name;
     }

     /* 设置最大上传的文件大小 */
     function set_size($max_size)
     {
         $this->max_size = $max_size * 1024;
     }

     /* 设置上传文件的扩展名集合 */
     function set_fexts($exts)
     {
         $this->fexts = $exts;
     }

     /* 设置目标文件存在时是否删除 */
     function set_del($bool)
     {
         $this->is_del = $bool;
     }
     /* 功能:上传文件操作
        参数:$dst_file:上传后的目标文件名,如果没有加扩展名则上传时自动加上原文件扩展名.
                 如果FILE控件是数组,则 $dst_file 为目标文件个数与上传的文件数匹配的数组,如下:
                 array('./img/a.jpg','./img/b.jpg') 也可为 array('./img/a','./img/b')

      返回值: [-1]成功 [0]:没有上传的文件 [1]:文件超过大小 [2]:不是指定的类型 
               [3]:目标文件已存在 [4]:目标文件不能写入 [5]:目标文件个数与上传的文件数不匹配
     */
     function upload($dst_file)
     {
         $ay = $_FILES[$this->input_name]['name'];
          if(is_array($ay)) //表单中的FILE控件是数组
         {
             if( !is_array($dst_file) || count($ay) != count($dst_file) ) return 5;
             $tmp_ay = array(); //临时数组保存暂时已上传成功的文件名,用于所有文件没有完全上传成功的情况删除它们
             $ret    = -1;
             foreach($ay as $key=>$val)
             {
                $file_name = $_FILES[$this->input_name]['name'][$key];    //上传的原文件名
                $file_size = $_FILES[$this->input_name]['size'][$key];    //上传后的临时文件名
                $tmp_file  = $_FILES[$this->input_name]['tmp_name'][$key];//文件大小
                if($file_name != '') //该控件上传了文件
                {
                    $ret = $this->_upload($file_name,$tmp_file,$file_size,$dst_file[$key]);
                    if( $ret != -1 ) //如果文件没有上传成功,就要删除已经上传的文件
                    {
                        for($i=0; $i<count($tmp_ay); $i++) @unlink($tmp_ay[$i]);
                        break;
                    }
                    $tmp_ay[]=$dst_file[$key];
                }
             }//End Foreach
             return $ret;
         }else{
             //---上传单个文件上传
             $file_name = $_FILES[$this->input_name]['name'];    //上传的原文件名 
              $tmp_file  = $_FILES[$this->input_name]['tmp_name'];//上传后的临时文件名
             $file_size = $_FILES[$this->input_name]['size'];    //文件大小
             return $this->_upload($file_name,$tmp_file,$file_size,$dst_file);
         }
     }
    /* 功能:得到已上传成功的文件名,多个用","隔开
       参数: $flg [0]:文件名有完整的路径 [1]:文件名不带路径
    */
    function uploaded_files($flg=0)
    {
        $files = '';
        if( $flg == 0 )
        {
            $files = $this->uploaded_file;
        }else{
            $ay=explode(',',$this->uploaded_file);
            for($i=0; $i<count($ay); $i++)
            {
                if( $files == '' )
                {
                    $files = basename($ay[$i]);
                }else{
                    $files .= ','.basename($ay[$i]);
                }
            }
        }
        return $files;
    }

    /* 得到上传的信息,如果FILE控件是个数组,则返回的是个二维数组,否则返回是一级数组 */
    function &uploadInfo()
    {
        $ay=array();
        if(!is_array($_FILES[$input_name]['name']))
        {
           $ay['name']     = $_FILES[$this->input_name]['name'];
           $ay['ext']      = strtolower(strrchr($ay['name'],'.'));
           $ay['type']     = $_FILES[$this->input_name]['type'];
           $ay['size']     = $_FILES[$this->input_name]['size'];
           $ay['tmp_name'] = $_FILES[$this->input_name]['tmp_name'];
        }else{
           foreach($_FILES[$input_name]['name'] as $i=>$val)
           {
               $ay[$i]['name']     = $_FILES[$this->input_name]['name'][$i];
               $ay[$i]['ext']      = strtolower(strrchr($ay[$i]['name'],'.'));
               $ay[$i]['type']     = $_FILES[$this->input_name]['type'][$i];
               $ay[$i]['size']     = $_FILES[$this->input_name]['size'][$i];
               $ay[$i]['tmp_name'] = $_FILES[$this->input_name]['tmp_name'][$i];
           }
        }//End If
        return $ay;
    }
    
    /* 功能: 得到上传的状态,数组包含 总的上传个数 和 真实文件个数(FILE控件数组中选择的文件数)
       返回: $ay['sum']:总的上传个数 $ay['up']:真实文件个数
    */
    function &upload_state()
    {
        $ay=array('sum'=>0,'up'=>0);
        if(!is_array($_FILES[$this->input_name]['name']))
        {
           $ay['sum']++;
           if( $_FILES[$this->input_name]['name'] != '' ) $ay['up']++;
        }else{
           foreach($_FILES[$this->input_name]['name'] as $i=>$val)
           {
               $ay['sum']++;
               if( $_FILES[$this->input_name]['name'][$i] != '' ) $ay['up']++;
           }
        }//End If
        return $ay;
    }
     /* 得到小写的文件扩展名,如".php" */
     function file_ext($file_name)
     {
         return strtolower(strrchr($file_name,"."));
     }
     /* -私有成员函数,不直接调用- */
     function _upload($file_name,$tmp_file,$file_size,$dst_file)
     {
        $ext       = $this->file_ext($file_name);     //得到原文件扩展名
        $dst_file  = str_replace("\\",'/',$dst_file); //兼容windows

        if( $tmp_file=='' || $file_size< 1 || !is_uploaded_file($tmp_file) )//没有上传的文件
        {
            return 0;
        }
        if( $this->max_size != 0 ) //限制了上传文件的大小
        {
           if($file_size > $this->max_size) //文件大小超过了限制
           {
                return 1;                    
           }
        }
        if( $this->fexts != "*") //限制了上传文件的类型
        {
           if( strstr($this->fexts,$ext) == '' )//不是指定的文件类型
           {
                return 2;
           }
        }
        if( $dst_file[strlen($dst_file)-1] == '/' ) //没有目标文件名,如"./file/"
        {
            return 4;
        }
        //---从最后的"/"处得到文件名,已更准确的判断目标文件是否加了扩展名
        if( strrchr($dst_file,"/") != '' ) //如果目标文件是这种形式:"./file_dir/picfile"
        {
            $tmp_file_name=strrchr($dst_file,"/"); //得到如"/picfile"
        }else{
            $tmp_file_name=$dst_file;
        }
        if( strrchr($tmp_file_name,".") == '')  //目标文件没有加扩展名就加上原文件扩展名
        {
            $dst_file .= $ext;
        }
        //---如果目标文件存在判断是否删除它
        if(file_exists($dst_file))
        {
            if($this->is_del)
            {
                @unlink($dst_file);
            }else{
                return 3;
            }
        }
        //---复制上传的文件到目标文件
        if(@copy($tmp_file,$dst_file))         
        {
             @chmod($dst_file,0777);
        }else{
            return 4;
        }
        @unlink($tmp_file);
        if( $this->uploaded_file == '' ) //文件上传成功就记录文件
        {
            $this->uploaded_file =    $dst_file;
        }else{
            $this->uploaded_file .=    ','.$dst_file;
        }
        return -1;
     }

 }//End Class

/* -----------表单中FILE控件是数组,多文件上传的调用例子如下--------------------------------*/
 $upload = new UPLOAD_CLASS('pic_file'); //FILE控件的名称,这里是数组
 $upload->set_fexts('.jpg|.jpeg|.gif|.png');
 $upload->set_size(200); //KB
 $up_ay = $upload->upload_state(); //得到上传的状态,以更好的进行上传操作
 if( $up_ay['up'] > 0 ) //如果用户上传了相片
 {
     for($i=0; $i<$up_ay['sum']; $i++) //生成对应的目标文件
     {
         $dst_file[] = get_rnd_filename(); //随机文件名,不含扩展名,因为UPLOAD_CLASS类可以自己加上上传文件的扩展名
     }
     $val = $upload->upload($dst_file);
     switch($val)
     {
         case 1:
             $msg='你上传的照片太大了,';
             break;
         case 2:
             $msg='你上传的照片不是指定的类型,';
             break;
         default:
             $msg='你上传的照片不合法,';
             break;
     }
 }

/*------------单个文件上传调用例子如下----------------------------------*/
 $upload = new UPLOAD_CLASS('pic_file');//FILE控件的名称
 $upload->set_fexts('.jpg|.jpeg|.gif|.png');
 $upload->set_size(200); //KB
 $up_ay = $upload->upload_state(); //得到上传的状态,以更好的进行上传操作
 if( $up_ay['up'] > 0 ) //如果用户上传了相片
 {
     $dst_file = get_rnd_filename(); //随机文件名,不含扩展名,因为UPLOAD_CLASS类可以自己加上上传文件的扩展名
     $val = $upload->upload($dst_file);
     switch($val)
     {
         case 1:
             $msg='你上传的照片太大了,';
             break;
         case 2:
             $msg='你上传的照片不是指定的类型,';
             break;
         default:
             $msg='你上传的照片不合法,';
             break;
     }
 }

作者: bzby555   发布时间: 2006-12-23

很好,不过希望楼主能简单介绍下原理和使用方法

作者: leehui1983   发布时间: 2006-12-23

作者: fengyun   发布时间: 2006-12-23

现在快下班了,我星期1上来传一个完整的实例 php+html  :)

作者: bzby555   发布时间: 2006-12-23

呵呵,我也想传个自己的整站实例

作者: leehui1983   发布时间: 2006-12-23

辛苦了

作者: cator   发布时间: 2006-12-23

作者: leehui1983   发布时间: 2006-12-23

OOP 的思想最近才看,楼主的帖子可谓雪中送炭啊;

作者: hy0kl   发布时间: 2006-12-24

oo是很重要滴

作者: leehui1983   发布时间: 2006-12-24

楼主的get_rnd_filename()这个函数在哪里?

作者: caibird   发布时间: 2007-01-10

学习.;P

作者: Poon   发布时间: 2007-01-12

up

作者: yyb   发布时间: 2007-03-02

收了

作者: aerial   发布时间: 2007-03-20

谢谢楼主的分享!

作者: louis75168611   发布时间: 2007-03-26

形如:
复制PHP内容到剪贴板
PHP代码:
if( $up_ay['up'] > 0 ) //如果用户上传了相片
 {
     for($i=0; $i<$up_ay['sum']; $i++) //生成对应的目标文件
     {
         $dst_file[] = get_rnd_filename(); //随机文件名,不含扩展名,因为UPLOAD_CLASS类可以自己加上上传文件的扩展名
     }
     $val = $upload->upload($dst_file);
     switch($val)
     {
         case 1:
             $msg='你上传的照片太大了,';
             break;
         case 2:
             $msg='你上传的照片不是指定的类型,';
             break;
         default:
             $msg='你上传的照片不合法,';
             break;
     }
 }

的判断
我觉得也应该弄到类里面去check

作者: muqiao   发布时间: 2007-03-27

有时候说明清楚一点可以方便大家的使用,谢谢了

作者: flymouse   发布时间: 2007-03-27

不过有点不明白的说

作者: flymouse   发布时间: 2007-03-27

怎么调用上传图片。
只有实例化类,和一些基本设置,如何调用。

作者: 特蓝克斯   发布时间: 2007-03-28

收藏了,学习。感谢楼主

作者: dayu   发布时间: 2007-03-28

引用:
原帖由 特蓝克斯 于 2007-3-28 10:06 发表
怎么调用上传图片。
只有实例化类,和一些基本设置,如何调用。
请看这个例子
复制PHP内容到剪贴板
PHP代码:
$upload = new UPLOAD_CLASS('img_file');
 $upload->set_fexts('.jpg|.jpeg|.gif|.png');
 $upload->set_size(150);//K
 $up_ay = $upload->upload_state();
 if( $up_ay['up'] < 1 ) //没有上传了相片
 {
  Msg_Page('请上传商品显示的图片!');
  return;
 }
 $dst_file = SAVE_PRODUCT_IMG . get_rnd_filename(); //32位随机文件名,不含扩展名,因为UPLOAD_CLASS类可以自己加上原扩展名
 $val = $upload->upload($dst_file);
 if( $val != -1 )
 {
  switch($val)
  {
   case 1:
    $msg='你上传的图片太大了!';
       break;
   case 2:
    $msg='你上传的图片不是指定的类型!';
       break;
   default:
    $msg='你上传的图片不合法!';
       break;
  }
  Msg_Page($msg);
  return;
 }
 $img_file = $upload->uploaded_files(); //完整路很的文件名,如  /http/site/img/ks.jpg
 //$img_file = $upload->uploaded_files(1); //基本文件名,如 ks.jpg
 
 copy($img_file,'/tmp/tmp.bak');

作者: bzby555   发布时间: 2007-03-28

还是没有读懂~!

作者: janefs   发布时间: 2007-10-17

I have a question
do you distill it from codeigniter?:)

作者: sunbaltti   发布时间: 2007-10-17

正要用,记号

作者: chouyu   发布时间: 2007-10-18

能记下了

作者: kissweb   发布时间: 2007-10-21

楼主的get_rnd_filename()这个函数在哪里?

作者: hdp13   发布时间: 2008-05-30

get_rnd_filename()找不到这个函数..出错了

作者: chxugao   发布时间: 2008-08-05