php上传图片工具类

php上传图片工具类

 

class Image
{
    var $error_no    = 0; //1->创建目录失败,2->图片格式不对,3->上传失败
    var $error_msg   = '';
    var $root_path   = '/data/www/kohana/images/';
    var $images_dir  = "images";
    var $bgcolor     = '';
    var $type_maping = array(1 => 'image/gif', 2 => 'image/jpeg', 3 => 'image/png');
    
    
    function __construct($bgcolor='')
    {
        $this->Image($bgcolor);
    }


    function Image($bgcolor='')
    {
        if ($bgcolor)
        {
            $this->bgcolor = $bgcolor;
        }
        else
        {
            $this->bgcolor = "#FFFFFF";
        }
        //$this->root_path = str_replace('classes/Model/Image.php','',str_replace('\\', '/', __FILE__));
    }

    /**
     * 图片上传的处理函数
     *
     * @access      public
     * @param       array       upload       包含上传的图片文件信息的数组
     * @param       array       dir          
     * @param       array       img_name     上传图片名称,为空则随机生成
     * @return      mix         如果成功则返回文件名,否则返回false
     */
    public function upload_image($upload, $dir = '', $img_name = '')
    {
        /* 没有指定目录默认为根目录images */
        if (empty($dir))
        {
            /* 创建当月目录 */
            $dir = date('Ym');
            $dir = $this->root_path . $this->images_dir . '/' . $dir . '/';
        }
        else
        {
            /* 创建目录 */
            $dir =  $this->root_path . $this->images_dir . '/' . $dir . '/';
            if ($img_name)
            {
                $img_name = $dir . $img_name; // 将图片定位到正确地址
            }
        }

        /* 如果目标目录不存在,则创建它 */
        if (!file_exists($dir))
        {
            if (!$this->make_dir($dir))
            {
                /* 创建目录失败 */
                $this->error_msg = sprintf('目录 % 不存在或不可写', $dir);
                $this->error_no  = 1;

                return false;
            }
        }

        if (empty($img_name))
        {
            $img_name = $this->unique_name($dir);
            $img_name = $dir . $img_name . $this->get_filetype($upload['name']);
        }

        if (!$this->check_img_type($upload['type']))
        {
            $this->error_msg = '不是允许的图片格式';
            $this->error_no  =  2;
            return false;
        }

        /* 允许上传的文件类型 */
        $allow_file_types = '|GIF|JPG|JEPG|PNG|BMP|SWF|';
        if (!$this->check_file_type($upload['tmp_name'], $img_name, $allow_file_types))
        {
            $this->error_msg = '不是允许的图片格式';
            $this->error_no  =  2;
            return false;
        }

        if ($this->move_file($upload, $img_name))
        {
            if($this->root_path != "/"){
                return str_replace($this->root_path, '', $img_name);
            }else{
                return $img_name;
            }
        }
        else
        {
            $this->error_msg = sprintf('文件 %s 上传失败。', $upload['name']);
            $this->error_no  = 3;

            return false;
        }
    }

 
    //返回错误信息
    public function error_msg()
    {
        return $this->error_msg;
    }

    /*------------------------------------------------------ */
    //-- 工具函数
    /*------------------------------------------------------ */

    /**
     * 检查图片类型
     * @param   string  $img_type   图片类型
     * @return  bool
     */
    public function check_img_type($img_type)
    {
        return $img_type == 'image/pjpeg' ||
               $img_type == 'image/x-png' ||
               $img_type == 'image/png'   ||
               $img_type == 'image/gif'   ||
               $img_type == 'image/jpeg';
    }

    /**
     * 检查图片处理能力
     *
     * @access  public
     * @param   string  $img_type   图片类型
     * @return  void
     */
    public function check_img_function($img_type)
    {
        switch ($img_type)
        {
            case 'image/gif':
            case 1:

                if (PHP_VERSION >= '4.3')
                {
                    return function_exists('imagecreatefromgif');
                }
                else
                {
                    return (imagetypes() & IMG_GIF) > 0;
                }
            break;

            case 'image/pjpeg':
            case 'image/jpeg':
            case 2:
                if (PHP_VERSION >= '4.3')
                {
                    return function_exists('imagecreatefromjpeg');
                }
                else
                {
                    return (imagetypes() & IMG_JPG) > 0;
                }
            break;

            case 'image/x-png':
            case 'image/png':
            case 3:
                if (PHP_VERSION >= '4.3')
                {
                     return function_exists('imagecreatefrompng');
                }
                else
                {
                    return (imagetypes() & IMG_PNG) > 0;
                }
            break;

            default:
                return false;
        }
    }

    //生成随机的数字串
    public function random_filename()
    {
        $str = '';
        for($i = 0; $i < 9; $i++)
        {
            $str .= mt_rand(0, 9);
        }

        return (time() - date('Z')) . $str;
    }

    //要检查是否有同名文件的目录
    public function unique_name($dir)
    {
        $filename = '';
        while (empty($filename))
        {
            $filename = $this->random_filename();
            if (file_exists($dir . $filename . '.jpg') || file_exists($dir . $filename . '.gif') || file_exists($dir . $filename . '.png'))
            {
                $filename = '';
            }
        }

        return $filename;
    }

    // 返回文件后缀名
    public function get_filetype($path)
    {
        $pos = strrpos($path, '.');
        if ($pos !== false)
        {
            return substr($path, $pos);
        }
        else
        {
            return '';
        }
    }


    public function move_file($upload, $target)
    {
        if (isset($upload['error']) && $upload['error'] > 0)
        {
            return false;
        }

        if (!$this->move_upload_file($upload['tmp_name'], $target))
        {
            return false;
        }

        return true;
    }
    
    //将上传文件转移到指定位置
    public function move_upload_file($file_name, $target_name = '')
    {
        if (function_exists("move_uploaded_file"))
        {
            if (move_uploaded_file($file_name, $target_name))
            {
                @chmod($target_name,0755);
                return true;
            }
            else if (copy($file_name, $target_name))
            {
                @chmod($target_name,0755);
                return true;
            }
        }
        elseif (copy($file_name, $target_name))
        {
            @chmod($target_name,0755);
            return true;
        }
        return false;
    }
    
    public function copy_file($file_name){
         $pos        = strpos(basename($file_name), '.');
         $newname    = dirname($file_name) . '/' . $this->random_filename() . substr(basename($file_name), $pos);
         if (copy($this->root_path. '/' .$file_name, $this->root_path. '/' .$newname))
         {
            @chmod( $this->root_path. '/' .$newname,0755);
            return $newname;
         }
        
         return false;
    }
    
    /**
     * 格式化商品图片名称(按目录存储)
     *
     */
    public function reformat_image_name($type, $goods_id, $source_img, $position='')
    {
        $rand_name = time() . sprintf("%03d", mt_rand(1,999));
        $img_ext = substr($source_img, strrpos($source_img, '.'));
        $dir = $this->images_dir;

        $sub_dir = date('Ym', time());
        if (!$this->make_dir($this->root_path . $dir.'/'.$sub_dir))
        {
            return false;
        }
        if (!$this->make_dir($this->root_path.$dir.'/'.$sub_dir.'/source_img'))
        {
            return false;
        }
        if (!$this->make_dir($this->root_path.$dir.'/'.$sub_dir.'/goods_img'))
        {
            return false;
        }
        if (!$this->make_dir($this->root_path.$dir.'/'.$sub_dir.'/thumb_img'))
        {
            return false;
        }
        
        if (!$this->make_dir($this->root_path.$dir.'/'.$sub_dir.'/attr_img'))
        {
            return false;
        }
        
        switch($type)
        {
            case 'goods':
                $img_name = $goods_id . '_G_' . $rand_name;
                break;
            case 'goods_thumb':
                $img_name = $goods_id . '_thumb_G_' . $rand_name;
                break;
            case 'gallery':
                $img_name = $goods_id . '_P_' . $rand_name;
                break;
            case 'gallery_thumb':
                $img_name = $goods_id . '_thumb_P_' . $rand_name;
                break;
            case 'attr':
                $img_name = $goods_id . '_attr_P_' . $rand_name;
                break;
        }
        if ($position == 'source')
        {
            if ($this->move_image_file($this->root_path.$source_img, $this->root_path.$dir.'/'.$sub_dir.'/source_img/'.$img_name.$img_ext))
            {
                return $dir.'/'.$sub_dir.'/source_img/'.$img_name.$img_ext;
            }
        }
        elseif ($position == 'thumb')
        {
            if ($this->move_image_file($this->root_path.$source_img, $this->root_path.$dir.'/'.$sub_dir.'/thumb_img/'.$img_name.$img_ext))
            {
                return $dir.'/'.$sub_dir.'/thumb_img/'.$img_name.$img_ext;
            }
        }
        elseif ($position == 'attr')
        {
            if ($this->move_image_file($this->root_path.$source_img, $this->root_path.$dir.'/'.$sub_dir.'/attr_img/'.$img_name.$img_ext))
            {
                return $dir.'/'.$sub_dir.'/attr_img/'.$img_name.$img_ext;
            }
        }
        else
        {
            if ($this->move_image_file($this->root_path.$source_img, $this->root_path.$dir.'/'.$sub_dir.'/goods_img/'.$img_name.$img_ext))
            {
                return $dir.'/'.$sub_dir.'/goods_img/'.$img_name.$img_ext;
            }
        }
        return false;
    }

    public function move_image_file($source, $dest)
    {
        if (@copy($source, $dest))
        {
            @unlink($source);
            return true;
        }
        return false;
    }
    
    
    /**
     * 检查目标文件夹是否存在,如果不存在则自动创建该目录
     */
    public function make_dir($folder)
    {
        $reval = false;
    
        if (!file_exists($folder))
        {
            /* 如果目录不存在则尝试创建该目录 */
            @umask(0);
    
            /* 将目录路径拆分成数组 */
            preg_match_all('/([^\/]*)\/?/i', $folder, $atmp);
    
            /* 如果第一个字符为/则当作物理路径处理 */
            $base = ($atmp[0][0] == '/') ? '/' : '';
    
            /* 遍历包含路径信息的数组 */
            foreach ($atmp[1] AS $val)
            {
                if ('' != $val)
                {
                    $base .= $val;
    
                    if ('..' == $val || '.' == $val)
                    {
                        /* 如果目录为.或者..则直接补/继续下一个循环 */
                        $base .= '/';
    
                        continue;
                    }
                }
                else
                {
                    continue;
                }
    
                $base .= '/';
    
                if (!file_exists($base))
                {
                    /* 尝试创建目录,如果创建失败则继续循环 */
                    if (@mkdir(rtrim($base, '/'), 0777))
                    {
                        @chmod($base, 0777);
                        $reval = true;
                    }
                }
            }
        }
        else
        {
            /* 路径已经存在。返回该路径是不是一个目录 */
            $reval = is_dir($folder);
        }
    
        clearstatcache();
    
        return $reval;
    }
    
    public function check_file_type($filename, $realname = '', $limit_ext_types = '')
    {
        if ($realname)
        {
            $extname = strtolower(substr($realname, strrpos($realname, '.') + 1));
        }
        else
        {
            $extname = strtolower(substr($filename, strrpos($filename, '.') + 1));
        }
    
        if ($limit_ext_types && stristr($limit_ext_types, '|' . $extname . '|') === false)
        {
            return '';
        }
    
        $str = $format = '';
    
        $file = @fopen($filename, 'rb');
        if ($file)
        {
            $str = @fread($file, 0x400); // 读取前 1024 个字节
            @fclose($file);
        }
        else
        {
            if (stristr($filename, $this->root_path) === false)
            {
                if ($extname == 'jpg' || $extname == 'jpeg' || $extname == 'gif' || $extname == 'png' || $extname == 'doc' ||
                    $extname == 'xls' || $extname == 'txt'  || $extname == 'zip' || $extname == 'rar' || $extname == 'ppt' ||
                    $extname == 'pdf' || $extname == 'rm'   || $extname == 'mid' || $extname == 'wav' || $extname == 'bmp' ||
                    $extname == 'swf' || $extname == 'chm'  || $extname == 'sql' || $extname == 'cert'|| $extname == 'pptx' ||
                    $extname == 'xlsx' || $extname == 'docx')
                {
                    $format = $extname;
                }
            }
            else
            {
                return '';
            }
        }
    
        if ($format == '' && strlen($str) >= 2 )
        {
            if (substr($str, 0, 4) == 'MThd' && $extname != 'txt')
            {
                $format = 'mid';
            }
            elseif (substr($str, 0, 4) == 'RIFF' && $extname == 'wav')
            {
                $format = 'wav';
            }
            elseif (substr($str ,0, 3) == "\xFF\xD8\xFF")
            {
                $format = 'jpg';
            }
            elseif (substr($str ,0, 4) == 'GIF8' && $extname != 'txt')
            {
                $format = 'gif';
            }
            elseif (substr($str ,0, 8) == "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A")
            {
                $format = 'png';
            }
            elseif (substr($str ,0, 2) == 'BM' && $extname != 'txt')
            {
                $format = 'bmp';
            }
            elseif ((substr($str ,0, 3) == 'CWS' || substr($str ,0, 3) == 'FWS') && $extname != 'txt')
            {
                $format = 'swf';
            }
            elseif (substr($str ,0, 4) == "\xD0\xCF\x11\xE0")
            {   // D0CF11E == DOCFILE == Microsoft Office Document
                if (substr($str,0x200,4) == "\xEC\xA5\xC1\x00" || $extname == 'doc')
                {
                    $format = 'doc';
                }
                elseif (substr($str,0x200,2) == "\x09\x08" || $extname == 'xls')
                {
                    $format = 'xls';
                } elseif (substr($str,0x200,4) == "\xFD\xFF\xFF\xFF" || $extname == 'ppt')
                {
                    $format = 'ppt';
                }
            } elseif (substr($str ,0, 4) == "PK\x03\x04")
            {
                if (substr($str,0x200,4) == "\xEC\xA5\xC1\x00" || $extname == 'docx')
                {
                    $format = 'docx';
                }
                elseif (substr($str,0x200,2) == "\x09\x08" || $extname == 'xlsx')
                {
                    $format = 'xlsx';
                } elseif (substr($str,0x200,4) == "\xFD\xFF\xFF\xFF" || $extname == 'pptx')
                {
                    $format = 'pptx';
                }else
                {
                    $format = 'zip';
                }
            } elseif (substr($str ,0, 4) == 'Rar!' && $extname != 'txt')
            {
                $format = 'rar';
            } elseif (substr($str ,0, 4) == "\x25PDF")
            {
                $format = 'pdf';
            } elseif (substr($str ,0, 3) == "\x30\x82\x0A")
            {
                $format = 'cert';
            } elseif (substr($str ,0, 4) == 'ITSF' && $extname != 'txt')
            {
                $format = 'chm';
            } elseif (substr($str ,0, 4) == "\x2ERMF")
            {
                $format = 'rm';
            } elseif ($extname == 'sql')
            {
                $format = 'sql';
            } elseif ($extname == 'txt')
            {
                $format = 'txt';
            }
        }
    
        if ($limit_ext_types && stristr($limit_ext_types, '|' . $format . '|') === false)
        {
            $format = '';
        }
    
        return $format;
    }
}