<?php
 
/*
 
this class will be used for bibivu system to upload files/pictures
 
to the right location for each module
 
2005-04-20 - v.1.0
 
*/
 
 
class bib_upload{
 
    var $error            = array();
 
    var $files            = array();
 
    var $file_max_size    = 1048576;
 
    var $_cfg            = array();
 
 
    function reset_all(){
 
        $this->error['number']    = 0;
 
        $this->error['text']    = '';
 
        $this->error['fatal']    = false;
 
        $this->files            = array();
 
        $this->file_new_name    = '';       // replace the name body
 
        $this->file_overwrite    = false;
 
 
        $this->file_max_size    = 1048576;
 
 
        $this->image_convert    = '';       // convert. values :''; 'png'; 'jpeg'; 'gif'
 
 
        $this->image_resize        = false;    // resize the image
 
        $this->image_x            = 150;
 
        $this->image_y            = 150;
 
        $this->image_ratio        = false;
 
        $this->image_ratio_no_zoom_in    = false;
 
        $this->image_ratio_no_zoom_out    = false;
 
    }
 
    function bib_upload($cfg){
 
        $this->reset_all();
 
        $this->_cfg['id']                = $cfg['id'];
 
        $this->_cfg['depth']            = $cfg['depth'];
 
        $this->_cfg['folder_site']        = $cfg['folder_site'];
 
        $this->_cfg['folder_module']    = $cfg['folder_module'];
 
    }
 
    function add_file($file){
 
//        print_r($this->error);
 
        if (!$file) {
 
            $this->set_error('1000','File upload error. Please try again.',true);
 
        } else  {
 
            if(is_array($file['error'])){
 
                //the files passed is an array of posts, I need to parse it
 
                $ret = false;
 
                foreach($file['error'] AS $key=>$value){
 
                    //I need to replace the same structure as the main array
 
                    $f1 = array();
 
                    foreach($file AS $kkey=>$vvalue){
 
                        $f1[$kkey] = $file[$kkey][$key];
 
                    }
 
                    if($ret==false){
 
                        $ret = $this->add_file($f1);
 
                    }
 
                }
 
                return $ret;
 
            } elseif($file['error'] === 0){
 
                if ($file['name'] == '') {
 
                    $this->set_error('1001','File upload error. Please try again.',true);
 
                } elseif ($file['size'] > $this->file_max_size ) {
 
                    $this->set_error('1002','File too big.',true);
 
                }
 
            } else {
 
                switch($file['error']) {
 
                    case 0:
 
                        // all is OK
 
                        break;
 
                    case 1:
 
                        $this->set_error($file['error']+2000,'File upload error (the uploaded file exceeds the upload_max_filesize directive in php.ini).',false);
 
                        break;
 
                    case 2:
 
                        $this->set_error($file['error']+2000,'File upload error (the uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the html form).',false);
 
                        break;
 
                    case 3:
 
                        $this->set_error($file['error']+2000,'File upload error (the uploaded file was only partially uploaded).',false);
 
                        break;
 
                    case 4:
 
                        $this->set_error($file['error']+2000,'File upload error (no file was uploaded).',false);
 
                        break;
 
                    default:
 
                        $this->set_error(2000,'File upload error (unknown error code).',true);
 
                        break;
 
                }
 
                return false;
 
            }
 
        }
 
        //there has been a fatal error
 
        if($this->error['fatal']){
 
            return false;
 
        } else {
 
            $this->files[] = $file;
 
        }
 
        return true;
 
    }
 
    function new_name($which = 0, $new_name = '', $overwrite = false, $auto_rename = true){
 
        //this function will apply to the last file uploaded
 
        $cc = count($this->files);
 
        if($cc == 0 || empty($this->files)){
 
            //there are not files to rename
 
            $this->set_error(3001,'There are not files uploaded yet.',false);
 
        } else {
 
            $cc--;
 
            if($which >= 0 && $which<=$cc)    $cc = $which;
 
            //if new_name is '', I have to create a random name
 
            if($new_name == ''){
 
                $new_name = strtoupper(substr(md5(time()*77+57),0,10));
 
            }
 
            $this->files[$cc]['new_name']        = $new_name;
 
            $this->files[$cc]['overwrite']        = $overwrite;
 
            $this->files[$cc]['auto_rename']    = $auto_rename;
 
        }
 
    }
 
    
 
    function resize($which = 0, $new_w=0, $new_h=0, $ratio = false){
 
        //resize the image keeping the 
 
        $cc = count($this->files);
 
        if($cc == 0 || empty($this->files)){
 
            //there are not files to rename
 
            $this->set_error(3001,'There are not files uploaded yet.',false);
 
        } else {
 
            $cc--;
 
            if($which >= 0 && $which<=$cc)    $cc = $which;
 
            $this->files[$cc]['new_w']    = $new_w;
 
            $this->files[$cc]['new_h']    = $new_h;
 
            $this->files[$cc]['ratio']    = $ratio;
 
        }
 
    }
 
    
 
    function is_image($which=0, $is_image=true){
 
        //resize the image keeping the 
 
        $cc = count($this->files);
 
        if($cc == 0 || empty($this->files)){
 
            //there are not files to rename
 
            $this->set_error(3001,'There are not files uploaded yet.',false);
 
        } else {
 
            $cc--;
 
            if($which >= 0 && $which<=$cc)    $cc = $which;
 
            $this->files[$cc]['is_image']    = $is_image;
 
        }
 
    }
 
    
 
    function process($module_code){
 
        if($this->error['fatal']){
 
            return false;
 
        }
 
        if($module_code == ''){
 
            $this->set_error('3001','Please Pass the module code .',true);
 
            return false;
 
        } else {
 
            $destpath = $this->_cfg['depth'].$this->_cfg['folder_site'].$this->_cfg['folder_module'].$module_code;
 
            //check if the folder exist, if not, try to create it with chmod=777
 
            if(!is_dir($destpath)){
 
                $oldumask = umask(0);
 
                mkdir($destpath,0777);
 
                umask($oldumask);
 
                if(!is_dir($destpath)){
 
                    $this->set_error('3002','Impossible to create the module folder.',true);
 
                    return false;
 
                }
 
            } elseif(!is_writable($destpath)) {
 
                $this->set_error('3003','Module folder is not writable.',true);
 
                return false;
 
            }
 
            $destpath .= '/';
 
            foreach($this->files AS $key=>$file){
 
                if(!isset($file['new_name']) || $file['new_name']==''){
 
                    $file['new_name'] = $file['name'];
 
                }
 
                $destfile = $destpath.$file['new_name'];
 
 
                if(isset($file['is_image'])){
 
                    if(isset($file['new_w']) && isset($file['new_h'])){
 
                        //check if I have to resize the file
 
                        $image_hw = @getimagesize($file['tmp_name']);
 
                        if(isset($image_hw) && !empty($image_hw)){
 
                            $picwidth    = $image_hw[0];
 
                            $picheigth    = $image_hw[1];
 
                            if( ($file['new_w'] < $picwidth)  ||
 
                                ($file['new_h'] < $picheigth) ){
 
                                //only reduce
 
                                if(_NETPBM_PATH!=''){
 
                                    require_once $this->_cfg['depth'].'files_includes/Transform.php';
 
                                    $im = new Image_Transform;
 
                                    $im->load($file['tmp_name']);
 
                                    if($file['ratio']){
 
                                        if($file['new_w'] <  $picwidth){
 
                                            $picheigth    = (int)(($file['new_w']*100/$picwidth)*$picheigth/100);
 
                                            $picwidth    = $file['new_w'];
 
                                        }
 
                                        if($file['new_h'] <  $picheigth){
 
                                            $picwidth    = (int)(($file['new_h']*100/$picheigth)*$picwidth/100);
 
                                            $picheigth    = $file['new_h'];
 
                                        }
 
                                    } else {
 
                                        $picwidth    = $file['new_w'];
 
                                        $picheigth    = $file['new_h'];
 
                                    }
 
                                    $im->resize($picwidth, $picheigth);
 
                                    $destfile = $destfile.'.'.$im->getWebSafeFormat();
 
                                    $destfile = $this->_check_filename($destfile,$file['overwrite'],$file['auto_rename']);
 
                                    if(!$destfile){
 
                                        $this->set_error(4003,'Error renaming the file.',false);
 
                                    } else {
 
                                        $im->save($destfile, $im->getWebSafeFormat());
 
                                        $this->files[$key]['new_name'] = basename($destfile);
 
                                        $im->free();
 
                                    }
 
                                } else {
 
                                    //is not an image or the file is not a compatible pic
 
                                    $this->set_error(4002,'NETPBM path not set.',false);
 
                                }
 
                            } else {
 
                                //not resize is necessary
 
                                $destfile = $this->_check_filename($destfile,$file['overwrite'],$file['auto_rename']);
 
                                if(!$destfile){
 
                                    $this->set_error(4003,'Error renaming the file.',false);
 
                                } else {
 
                                    move_uploaded_file($file['tmp_name'],$destfile);
 
                                }
 
                            }
 
                        } else {
 
                            //is not an image or the file is not a compatible pic
 
                            $this->set_error(4001,'The file '.$file['name'].' is not resizable.',false);
 
                        }
 
                    } else {
 
                        //the image is not resized
 
                        if(_NETPBM_PATH!=''){
 
                            require_once $this->_cfg['depth'].'files_includes/Transform.php';
 
                            $im = new Image_Transform;
 
                            $im->load($file['tmp_name']);
 
                            $destfile = $destfile.'.'.$im->getWebSafeFormat();
 
                            $destfile = $this->_check_filename($destfile,$file['overwrite'],$file['auto_rename']);
 
                            if(!$destfile){
 
                                $this->set_error(4003,'Error renaming the file.',false);
 
                            } else {
 
                                $im->save($destfile, $im->getWebSafeFormat());
 
                                $this->files[$key]['new_name'] = basename($destfile);
 
                                $im->free();
 
                            }
 
                            $im->save($destfile, $im->getWebSafeFormat());
 
                            $this->files[$key]['new_name'] = basename($destfile);
 
                            $im->free();
 
                        } else {
 
                            $destfile = $this->_check_filename($destfile,$file['overwrite'],$file['auto_rename']);
 
                            if(!$destfile){
 
                                $this->set_error(4003,'Error renaming the file.',false);
 
                            } else {
 
                                move_uploaded_file($file['tmp_name'],$destfile);
 
                            }
 
                        }
 
                    }
 
                } else {
 
                    //not a pic
 
                    $destfile = $this->_check_filename($destfile,$file['overwrite'],$file['auto_rename']);
 
                    if(!$destfile){
 
                        $this->set_error(4003,'Error renaming the file.',false);
 
                    } else {
 
                        move_uploaded_file($file['tmp_name'],$destfile);
 
                    }
 
                }
 
                if(file_exists($file['tmp_name'])){
 
                    //cleaning
 
                    @unlink($file['tmp_name']);
 
                }
 
            }
 
        }
 
        //there has been a fatal error
 
        if($this->error['fatal']){
 
            return false;
 
        } else {
 
            return $this->files;
 
        }
 
    }
 
    function _check_filename($name, $overwrite, $auto_rename){
 
        if($overwrite == false){
 
            if(file_exists($name)){
 
                if($auto_rename == true){
 
                    ereg('\.([^\.]*$)', $name, $ext);
 
                    $body = substr($name, 0, (strlen($name) - strlen($ext))-1);
 
                    $i = 1;
 
                    while (file_exists($name)) {
 
                        $this->name = $body.'_'.$i.'.'.$ext;
 
                        $i++;
 
                    }                     
 
                } else {
 
                    return false;
 
                }
 
            } else {
 
                //file do not exist
 
            }
 
        } else {
 
            //overwrite the file
 
        }
 
        return $name;
 
    }
 
 
    function set_error($number, $text, $fatal = false){
 
        $this->error['number']    = $number;
 
        $this->error['text']    = $text;
 
        $this->error['fatal']    = $fatal;
 
    }
 
}
 
?>
 
 |