文件上傳類。

支持自定義文件上傳、支持擴展多文件上傳功能。代碼如下

<code>

<?
/**
  * filename:upload.class.php
  * since:2006-11-28
  * description:文件上傳類。
  * author feifengxlq<許立強> http://www.phpobject.net/blog
  * version v0.02
  * demo:
  $upload=new upload(array('path'=>'../test','allow_type'=>array('txt')));
  print_r($upload->upfile('userfile'));
  自定義上傳文件名
  $upload=new upload();
  print_r($upload->upfile('userfile',array('allow_type'=>array('txt'),'filename'=>'test.txt')));
*/
class upload
{
    
    var $path='/uploadfiles/';//上傳文件的路徑
    
    var $allow_type=array('jpg','gif');//允許上傳的文件類型
    
    var $max_size='2048';//允許的最大文件大小
    
    //var $field='uploadfile';//上傳文件的字段名
    
    var $overwrite=false;//是否設置成覆蓋模式
    
    var $renamed=true;//是否直接使用上傳文件的名稱,還是系統自動命名
    
    //private    
    var $upfile=array();//上傳後文件信息
    
    var $ext='';//上傳文件的擴展名
    
    var $errormsg='';//出錯信息
    
    var $filename='';//是否設置了上傳後的文件名
    /**
      * 出錯模式
      * 0:出錯就exit
      * 1:出錯返回出錯信息
    */
    var $error_mode=0;//出錯模式
    
    function upload($options=array())
    {
       //構造
       $this->_set_options($options);
    }
    //上傳文件
    function upfile($field,$options=array())
    {
        //設置上傳文件的屬性
        $this->_set_options($options);
        //獲取文件
        $this->_set_upfile($field);
        //檢查文件
        $this->_check();
        //設置上傳後的文件名
        $this->_set_filename();
        //檢查是否出錯
        if($this->errormsg)return false;
        //上傳文件
        if(@move_uploaded_file($this->upfile['tmp_name'],$this->upfile['filename']))return $this->upfile;
        //上傳失敗
        $this->error(__FUNCTION__.'():'.$this->upfile['filename'].'上傳失敗。');
        return false;
    }
    //獲取出錯信息
    function get_error()
    {
        if($this->errormsg)return $this->errormsg;
        return false;
    }
/**-----------private-----------------------------------------------*/
    /**
      * 設置上傳後的文件名
    */
    function _set_filename()
    {
        //是否重命名
        if($this->filename){
            //如果用戶設置了文件名
            if(file_exists($this->filename))@unlink($this->filename);
            $this->upfile['filename']=$this->filename;
            return true;
        }
        //檢查上傳文件路徑
        if(!file_exists($this->path))$this->_mkpath($this->path);
        if($this->path[strlen($this->path)-1]!='/')$this->path.='/';//
        
        if($this->renamed){
            $ext=$this->ext;
            if(empty($ext))$ext=$this->_get_ext($this->upfile['name']);
            $filename=uniqid(time()).'.'.$ext;
        }else{
            $filename=$this->upfile['name'];
        }
        //是否覆蓋模式
        if(!$this->overwrite){
            //不覆蓋,檢查是否存在同名文件
            $i=1;
            while(file_exists($this->path.$filename)){
                $filename=$i.'_'.$filename;
                $i++;
            }
        }else{
            //覆蓋模式,如果存在改文件,則刪除
            if(file_exists($this->path.$filename))@unlink($this->path.$filename);
        }
        $this->upfile['filename']=$this->path.$filename;
    }
    /**
      * 檢查文件是否符合需要
    */
    function _check()
    {
        //檢查文件大小
        $this->_check_size();
        //檢查文件類型
        $this->_check_type();        
    }    
    /**
      * 設置屬性
    */
    function _set_options($options){
       if(is_array($options)){
           foreach($options as $key=>$value){
               if(in_array($key,array('path','allow_type','max_size','overwrite','renamed','error_mode','filename'))){
                   $this->_set($key,$value);
               }
           }
        }
    }
    /**
      * 檢查文件類型getimagesize
    */
    function _check_type()
    {
        $this->_get_ext($this->upfile['name']);
        $this->upfile['filetype']=$this->ext;
        if(in_array($this->ext,$this->allow_type))
        {
            //檢查mine類型
            $file_mine=$this->upfile['type'];
            if(empty($file_mine))return true;
            //檢查mine類型是否符合
            $this->_check_mine($file_mine);
        }else{
            $this->error(__FUNCTION__.'():'.$this->upfile['name'].'文件類型'.$this->ext.'不符合。只允許上傳'.implode(',',$this->allow_type));
        }
    }
    /**
      * 檢查上傳文件的mine類型
    */
    function _check_mine($mine)
    {
        require_once('filetype.php');
        $pass=false;
        foreach($this->allow_type as $type){
            if(is_array($filetype[$type])){
                if(in_array($mine,$filetype[$type])){
                    //
                    $pass=true;
                    break;
                }
            }elseif($filetype[$type]==$mine){
               $pass=true;
               break;
            }
        }
        if(!$pass)$this->error(__FUNCTION__.'():'.$this->upfile['name'].'文件mine類型不符合。只允許上傳'.implode(',',$this->allow_type));
    }
    /**
      * 獲取文件的後綴
    */
    function _get_ext($file){
        $ext = explode(".", $file);
        $ext = $ext[count($ext) - 1];
        $this->ext=strtolower($ext);
        return $this->ext;
    }
    /**
      * 檢查文件大小
    */
    function _check_size()
    {
        if($this->upfile['size']>$this->max_size*1024)
        $this->error(__FUNCTION__.'():'.$this->upfile['name'].'文件大小超過了限制'.$this->max_size.'MB');
    }
    /**
      * 獲取文件
      * @param field
      * @return  
    */
    function _set_upfile($field)
    {
        if(!$_FILES[$field])$this->error(__FUNCTION__.'():文件不存在!');
        if($_FILES[$field]['error']>=1)$this->error(__FUNCTION__.'():'.$this->_get_upload_error($_FILES[$field]['error']));
        $this->upfile=$_FILES[$field];
    }
    
    
    function _set($key,$value){
        $this->$key=$value;
    }
    
    /**
      * 構造目錄
    */
    function _mkpath($path,$mode=700){
        $path=str_replace("//","/",$path);
        $path_info=explode('/',$path);
        $total=count($path_info);
        $path='';
        for($i=0;$i<$total;$i++)
        {
            $path.=$path_info[$i].'/';
            if(empty($path_info[$i]))continue;
            if(file_exists($path))
            {
                continue;
            }else{
                if(!@mkdir($path,$mode))$this->error(__FUNCTION__.'(),創建'.$path.'出錯!');
            }
        }
        return true;
    }
    /**
      * 格式化文件大小
    */
    function format_size($size)
    {
        if($size<1024){
            return $size.'B';
        }elseif ($size<1024*1024){
            return number_format((double)($size/1024),2).'KB';
        }else{
            return number_format((double)($size/(1024*1024)),2).'MB';
        }
    }
    /**
      * 獲取上傳出錯信息(根據$_FILES['file']['error]])
    */
    function _get_upload_error($id)
    {
        switch($id)
        {
            case 1:
                return '上傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值';
            case 2:
                return '上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值';
            case 3:
                return '文件只有部分被上傳';
            case 4:
                return '沒有文件被上傳';
            case 5:
                return '未知錯誤!';
            case 6:
                return '找不到臨時文件夾';
            case 7:
                return '文件寫入失敗';
            default:
                return '未知錯誤!';
        }
    }
    /**
      * 出錯處理!
    */
    function error($msg)
    {
        if($this->error_mode==0)die('ERROR : file '.__FILE__.' function '.$msg);
        $this->errormsg.='ERROR : file '.__FILE__.' function '.$msg."/n";
    }
}
?>[/code2]


其中幾個簡單的調用demo


[code2]<?
$upload=new upload(array('path'=>'../test','allow_type'=>array('txt')));
  print_r($upload->upfile('userfile'));
  自定義上傳文件名
  $upload=new upload();
  print_r($upload->upfile('userfile',array('allow_type'=>array('txt'),'filename'=>'test.txt')));
?> [/code2]

另外其中有個filetype.php文件
常用文件得mine類型。


<?
$filetype=array();
$filetype['hqx']="application/mac-binhex40";
$filetype['bin']="application/octet-stream";
$filetype['oda']="application/oda";
$filetype['pdf']="application/pdf";
$filetype['ai']="application/postsrcipt";
$filetype['eps']="application/postsrcipt";
$filetype['es']="application/postsrcipt";
$filetype['rtf']="application/rtf";
$filetype['mif']="application/x-mif";
$filetype['csh']="application/x-csh";
$filetype['dvi']="application/x-dvi";
$filetype['hdf']="application/x-hdf";
$filetype['nc']="application/x-netcdf";
$filetype['cdf']="application/x-netcdf";
$filetype['latex']="application/x-latex";
$filetype['ts']="application/x-troll-ts";
$filetype['src']="application/x-wais-source";
$filetype['zip']="application/zip";
$filetype['bcpio']="application/x-bcpio";
$filetype['cpio']="application/x-cpio";
$filetype['gtar']="application/x-gtar";
$filetype['shar']="application/x-shar";
$filetype['sv4cpio']="application/x-sv4cpio";
$filetype['sv4crc']="application/x-sv4crc";
$filetype['tar']="application/x-tar";
$filetype['ustar']="application/x-ustar";
$filetype['man']="application/x-troff-man";
$filetype['sh']="application/x-sh";
$filetype['tcl']="application/x-tcl";
$filetype['tex']="application/x-tex";
$filetype['texi']="application/x-texinfo";
$filetype['texinfo']="application/x-texinfo";
$filetype['t']="application/x-troff";
$filetype['tr']="application/x-troff";
$filetype['roff']="application/x-troff";
$filetype['shar']="application/x-shar";
$filetype['me']="application/x-troll-me";
$filetype['ts']="application/x-troll-ts";
$filetype['gif']="image/gif";
$filetype['jpeg']="image/pjpeg";
$filetype['jpg']=array("image/pjpeg","image/jpeg");
$filetype['jpe']="image/pjpeg";
$filetype['ras']="image/x-cmu-raster";
$filetype['pbm']="image/x-portable-bitmap";
$filetype['ppm']="image/x-portable-pixmap";
$filetype['xbm']="image/x-xbitmap";
$filetype['xwd']="image/x-xwindowdump";
$filetype['ief']="image/ief";
$filetype['tif']="image/tiff";
$filetype['tiff']="image/tiff";
$filetype['pnm']="image/x-portable-anymap";
$filetype['pgm']="image/x-portable-graymap";
$filetype['rgb']="image/x-rgb";
$filetype['xpm']="image/x-xpixmap";
$filetype['txt']="text/plain";
$filetype['c']="text/plain";
$filetype['cc']="text/plain";
$filetype['h']="text/plain";
$filetype['html']="text/html";
$filetype['htm']="text/html";
$filetype['htl']="text/html";
$filetype['rtx']="text/richtext";
$filetype['etx']="text/x-setext";
$filetype['tsv']="text/tab-separated-values";
$filetype['mpeg']="video/mpeg";
$filetype['avi']="video/avi";
$filetype['rm']="video/rm";
$filetype['rmvb']="video/rmvb";
$filetype['wmv']="video/x-ms-wmv";
$filetype['flv']="application/octet-stream";
$filetype['mpg']="video/mpeg";
$filetype['mpe']="video/mpeg";
$filetype['avi']="video/x-msvideo";
$filetype['qt']="video/quicktime";
$filetype['mov']="video/quicktime";
$filetype['moov']="video/quicktime";
$filetype['movie']="video/x-sgi-movie";
$filetype['au']="audio/basic";
$filetype['mp3']="audio/mp3";
$filetype['snd']="audio/basic";
$filetype['wav']="audio/wav";
$filetype['wma']="audio/x-ms-wma";
$filetype['aif']="audio/x-aiff";
$filetype['aiff']="audio/x-aiff";
$filetype['aifc']="audio/x-aiff";
$filetype['swf']="application/x-shockwave-flash";
$filetype['doc']="application/msword";
$filetype['ini']='application/octet-stream';
?>


</code>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章