thinkphp改写的上传类及缩放水印类

来源:互联网 发布:net域名注册1元 编辑:程序博客网 时间:2024/04/29 03:47
<?php// +----------------------------------------------------------------------// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]// +----------------------------------------------------------------------// | Copyright (c) 2009 http://thinkphp.cn All rights reserved.// +----------------------------------------------------------------------// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )// +----------------------------------------------------------------------// | Author: liu21st <liu21st@gmail.com>// +----------------------------------------------------------------------// $Id$/** +------------------------------------------------------------------------------ * 文件上传类 +------------------------------------------------------------------------------ * @category   ORG * @package  ORG * @subpackage  Net * @author    liu21st <liu21st@gmail.com> * @version   $Id$ +------------------------------------------------------------------------------ */class UploadFile{//类定义开始    // 上传文件的最大值    public $maxSize = -1;    // 是否支持多文件上传    public $supportMulti = true;    // 允许上传的文件后缀    //  留空不作后缀检查    public $allowExts = array();    // 允许上传的文件类型    // 留空不做检查    public $allowTypes = array();    // 使用对上传图片进行缩略图处理    public $thumb   =  true;        // 缩略图最大宽度    public $thumbWidth=400;    // 缩略图最大高度    public $thumbHeight=400;    // 缩略图前缀    public $thumbPrefix   =  'thumb_';    public $thumbSuffix  =  ',';    // 缩略图保存路径    public $thumbPath = '';    // 缩略图文件名    public $thumbFile='';    // 是否移除原图    public $thumbRemoveOrigin =true;    // 启用子目录保存文件    public $autoSub   =  false;    // 子目录创建方式 可以使用hash date    public $subType   = 'date';    public $dateFormat = 'Ym';    public $hashLevel =  1; // hash的目录层次    // 上传文件保存路径    public $savePath = '';    public $autoCheck = true; // 是否自动检查附件    // 存在同名是否覆盖    public $uploadReplace = false;    // 上传文件命名规则    // 例如可以是 time uniqid com_create_guid 等    // 必须是一个无需任何参数的函数名 可以使用自定义函数    public $saveRule = 'uniqid';    // 错误信息    private $error = '';    // 上传成功的文件信息    private $uploadFileInfo ;    /**     +----------------------------------------------------------     * 架构函数     +----------------------------------------------------------     * @access public     +----------------------------------------------------------     */    public function __construct($maxSize='',$allowExts='',$allowTypes='',$savePath='',$saveRule='')    {        if(!empty($maxSize) && is_numeric($maxSize)) {            $this->maxSize = $maxSize;        }        if(!empty($allowExts)) {            if(is_array($allowExts)) {                $this->allowExts = array_map('strtolower',$allowExts);            }else {                $this->allowExts = explode(',',strtolower($allowExts));            }        }        if(!empty($allowTypes)) {            if(is_array($allowTypes)) {                $this->allowTypes = array_map('strtolower',$allowTypes);            }else {                $this->allowTypes = explode(',',strtolower($allowTypes));            }        }        if(!empty($saveRule)) {            $this->saveRule = $saveRule;        }        $this->savePath .= $savePath;    }    /**     +----------------------------------------------------------     * 上传一个文件     +----------------------------------------------------------     * @access public     +----------------------------------------------------------     * @param mixed $name 数据     * @param string $value  数据表名     +----------------------------------------------------------     * @return string     +----------------------------------------------------------     * @throws ThinkExecption     +----------------------------------------------------------     */    private function save(&$file)    {        $filename = $file['savepath'].$file['savename'];        if(!$this->uploadReplace && is_file($filename)) {            // 不覆盖同名文件            $this->error='文件已经存在!'.$filename;            return false;        }        // 如果是图像文件 检测文件格式        if( in_array(strtolower($file['extension']),array('gif','jpg','jpeg','bmp','png','swf')) && false === getimagesize($file['tmp_name'])) {            $this->error = '非法图像文件';            return false;        }        if(!move_uploaded_file($file['tmp_name'],$filename)) {            $this->error = '文件上传保存错误!';            return false;        }        if($this->thumb && in_array(strtolower($file['extension']),array('gif','jpg','jpeg','bmp','png'))) {            $image =  getimagesize($filename);            if(false !== $image) {                                        //是图像文件生成缩略图                               $thumbPath    =  $this->thumbPath?$this->thumbPath:$file['savepath'];                               $realFilename  =  $this->autoSub?basename($file['savename']):$file['savename'];                                                    $thumbname=$this->thumbPrefix.substr($realFilename,0,strrpos($realFilename, '.')).'.'.$file['extension'];                                                          if(Image::thumb($filename,$thumbPath.$thumbname,'',$this->thumbWidth,$this->thumbHeight,true)){                         $file['thumb']=$thumbname;                                   }                                       if($this->thumbRemoveOrigin) {                    // 生成缩略图之后删除原图                    unlink($filename);                                        }                                                            }        }        return true;    }    /**     +----------------------------------------------------------     * 上传所有文件     +----------------------------------------------------------     * @access public     +----------------------------------------------------------     * @param string $savePath  上传文件保存路径     +----------------------------------------------------------     * @return string     +----------------------------------------------------------     * @throws ThinkExecption     +----------------------------------------------------------     */    public function upload($savePath ='')    {        //如果不指定保存文件名,则由系统默认        if(empty($savePath))            $savePath = $this->savePath;        // 检查上传目录        if(!is_dir($savePath)) {            // 检查目录是否编码后的            if(is_dir(base64_decode($savePath))) {                $savePath=base64_decode($savePath);            }else{                // 尝试创建目录                if(!mkdir($savePath)){                    $this->error  =  '上传目录'.$savePath.'不存在';                    return false;                }            }        }else {            if(!is_writeable($savePath)) {                $this->error  =  '上传目录'.$savePath.'不可写';                return false;            }        }        $fileInfo = array();        $isUpload   = false;        // 获取上传的文件信息        // 对$_FILES数组信息处理        $files = $this->dealFiles($_FILES);        foreach($files as $key => $file) {            //过滤无效的上传            if(!empty($file['name'])) {                //登记上传文件的扩展信息                $file['key']          =  $key;                $file['extension']  = $this->getExt($file['name']);                $file['savepath']   = $savePath;                $file['savename']   = $this->getSaveName($file);                // 自动检查附件                if($this->autoCheck) {                    if(!$this->check($file))                        return false;                }                //保存上传文件                if(!$this->save($file)) return false;                               //上传成功后保存文件信息,供其他地方调用                unset($file['tmp_name'],$file['error']);                $fileInfo[] = $file;                $isUpload   = true;            }        }        if($isUpload) {            $this->uploadFileInfo = $fileInfo;            return true;        }else {            $this->error  =  '没有选择上传文件';            return false;        }    }    /**     +----------------------------------------------------------     * 上传单个上传字段中的文件 支持多附件     +----------------------------------------------------------     * @access public     +----------------------------------------------------------     * @param array $file  上传文件信息     * @param string $savePath  上传文件保存路径     +----------------------------------------------------------     * @return string     +----------------------------------------------------------     * @throws ThinkExecption     +----------------------------------------------------------     */    public function uploadOne($file,$savePath=''){        //如果不指定保存文件名,则由系统默认            if(empty($savePath))            $savePath = $this->savePath;                // 检查上传目录        if(!is_dir($savePath)) {                    // 尝试创建目录            if(!mkdir($savePath)){                $this->error  =  '上传目录'.$savePath.'不存在';                return false;            }        }else {            if(!is_writeable($savePath)) {                $this->error  =  '上传目录'.$savePath.'不可写';                return false;            }        }        //过滤无效的上传        if(!empty($file['name'])) {            $fileArray = array();            if(is_array($file['name'])) {               $keys = array_keys($file);               $count = count($file['name']);               for ($i=0; $i<$count; $i++) {                   foreach ($keys as $key)                       $fileArray[$i][$key] = $file[$key][$i];               }            }else{                $fileArray[] =  $file;            }            $info =  array();            foreach ($fileArray as $key=>$file){                //登记上传文件的扩展信息                $file['extension']  = $this->getExt($file['name']);                $file['savepath']   = $savePath;                $file['savename']   = $this->getSaveName($file);                // 自动检查附件                               if($this->autoCheck) {                    if(!$this->check($file))                        return false;                }                //保存上传文件                if(!$this->save($file)) return false;                                unset($file['tmp_name'],$file['error']);                $info[] = $file;                $isUpload=true;            }            if($isUpload) {            $this->uploadFileInfo = $info;            return true;            // 返回上传的文件信息            }        }else {            $this->error  =  '没有选择上传文件';            return false;        }    }    /**     +----------------------------------------------------------     * 转换上传文件数组变量为正确的方式     +----------------------------------------------------------     * @access private     +----------------------------------------------------------     * @param array $files  上传的文件变量     +----------------------------------------------------------     * @return array     +----------------------------------------------------------     */    private function dealFiles($files) {       $fileArray = array();       $n = 0;       foreach ($files as $file){           if(is_array($file['name'])) {               $keys = array_keys($file);               $count = count($file['name']);               for ($i=0; $i<$count; $i++) {                   foreach ($keys as $key)                       $fileArray[$n][$key] = $file[$key][$i];                   $n++;               }           }else{               $fileArray[$n] = $file;               $n++;           }       }       return $fileArray;    }    /**     +----------------------------------------------------------     * 获取错误代码信息     +----------------------------------------------------------     * @access public     +----------------------------------------------------------     * @param string $errorNo  错误号码     +----------------------------------------------------------     * @return void     +----------------------------------------------------------     * @throws ThinkExecption     +----------------------------------------------------------     */    protected function error($errorNo)    {         switch($errorNo) {            case 1:                $this->error = '上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值';                break;            case 2:                $this->error = '上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值';                break;            case 3:                $this->error = '文件只有部分被上传';                break;            case 4:                $this->error = '没有文件被上传';                break;            case 6:                $this->error = '找不到临时文件夹';                break;            case 7:                $this->error = '文件写入失败';                break;            default:                $this->error = '未知上传错误!';        }        return ;    }    /**     +----------------------------------------------------------     * 根据上传文件命名规则取得保存文件名     +----------------------------------------------------------     * @access private     +----------------------------------------------------------     * @param string $filename 数据     +----------------------------------------------------------     * @return string     +----------------------------------------------------------     */    private function getSaveName($filename)    {        $rule = $this->saveRule;        if(empty($rule)) {//没有定义命名规则,则保持文件名不变            $saveName = $filename['name'];        }else {            if(function_exists($rule)) {                //使用函数生成一个唯一文件标识号                $saveName = $rule().".".$filename['extension'];            }else {                //使用给定的文件名作为标识号                $saveName = $rule.".".$filename['extension'];            }        }        if($this->autoSub) {            // 使用子目录保存文件            $filename['savename'] = $saveName;            $saveName = $this->getSubName($filename).'/'.$saveName;        }        return $saveName;    }    /**     +----------------------------------------------------------     * 获取子目录的名称     +----------------------------------------------------------     * @access private     +----------------------------------------------------------     * @param array $file  上传的文件信息     +----------------------------------------------------------     * @return string     +----------------------------------------------------------     */    private function getSubName($file)    {        switch($this->subType) {            case 'date':                $dir   =  date($this->dateFormat,time());                break;            case 'hash':             default:                $name = md5($file['savename']);                $dir   =  '';                for($i=0;$i<$this->hashLevel;$i++) {                $dir   .=  $name{$i}.'/';                }                break;        }        if(!is_dir($file['savepath'].$dir)) {            mkdir($file['savepath'].$dir);        }        return $dir;    }    /**     +----------------------------------------------------------     * 检查上传的文件     +----------------------------------------------------------     * @access private     +----------------------------------------------------------     * @param array $file 文件信息     +----------------------------------------------------------     * @return boolean     +----------------------------------------------------------     */    private function check($file) {        if($file['error']!== 0) {            //文件上传失败            //捕获错误代码            $this->error($file['error']);            return false;        }        //文件上传成功,进行自定义规则检查        //检查文件大小        if(!$this->checkSize($file['size'])) {            $this->error = '上传文件大小不符!';            return false;        }        //检查文件Mime类型        if(!$this->checkType($file['type'])) {            $this->error = '上传文件MIME类型不允许!';            return false;        }        //检查文件类型        if(!$this->checkExt($file['extension'])) {            $this->error ='上传文件类型不允许';            return false;        }        //检查是否合法上传        if(!$this->checkUpload($file['tmp_name'])) {            $this->error = '非法上传文件!';            return false;        }        return true;    }    /**     +----------------------------------------------------------     * 检查上传的文件类型是否合法     +----------------------------------------------------------     * @access private     +----------------------------------------------------------     * @param string $type 数据     +----------------------------------------------------------     * @return boolean     +----------------------------------------------------------     */    private function checkType($type)    {        if(!empty($this->allowTypes))            return in_array(strtolower($type),$this->allowTypes);        return true;    }    /**     +----------------------------------------------------------     * 检查上传的文件后缀是否合法     +----------------------------------------------------------     * @access private     +----------------------------------------------------------     * @param string $ext 后缀名     +----------------------------------------------------------     * @return boolean     +----------------------------------------------------------     */    private function checkExt($ext)    {        if(!empty($this->allowExts))            return in_array(strtolower($ext),$this->allowExts,true);        return true;    }    /**     +----------------------------------------------------------     * 检查文件大小是否合法     +----------------------------------------------------------     * @access private     +----------------------------------------------------------     * @param integer $size 数据     +----------------------------------------------------------     * @return boolean     +----------------------------------------------------------     */    private function checkSize($size)    {        return !($size > $this->maxSize) || (-1 == $this->maxSize);    }    /**     +----------------------------------------------------------     * 检查文件是否非法提交     +----------------------------------------------------------     * @access private     +----------------------------------------------------------     * @param string $filename 文件名     +----------------------------------------------------------     * @return boolean     +----------------------------------------------------------     */    private function checkUpload($filename)    {        return is_uploaded_file($filename);    }    /**     +----------------------------------------------------------     * 取得上传文件的后缀     +----------------------------------------------------------     * @access private     +----------------------------------------------------------     * @param string $filename 文件名     +----------------------------------------------------------     * @return boolean     +----------------------------------------------------------     */    private function getExt($filename)    {        $pathinfo = pathinfo($filename);        return $pathinfo['extension'];    }    /**     +----------------------------------------------------------     * 取得上传文件的信息     +----------------------------------------------------------     * @access public     +----------------------------------------------------------     * @return array     +----------------------------------------------------------     */    public function getUploadFileInfo()    {        return $this->uploadFileInfo;    }    /**     +----------------------------------------------------------     * 取得最后一次错误信息     +----------------------------------------------------------     * @access public     +----------------------------------------------------------     * @return string     +----------------------------------------------------------     */    public function getErrorMsg()    {        return $this->error;    }}//类定义结束?>
<?php// +----------------------------------------------------------------------// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]// +----------------------------------------------------------------------// | Copyright (c) 2009 http://thinkphp.cn All rights reserved.// +----------------------------------------------------------------------// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )// +----------------------------------------------------------------------// | Author: liu21st <liu21st@gmail.com>// +----------------------------------------------------------------------// $Id$/**  +------------------------------------------------------------------------------ * 图像操作类库  +------------------------------------------------------------------------------ * @category   ORG * @package  ORG * @subpackage  Util * @author    liu21st <liu21st@gmail.com> * @version   $Id$  +------------------------------------------------------------------------------ */class Image{//类定义开始    /**      +----------------------------------------------------------     * 取得图像信息     *      +----------------------------------------------------------     * @static     * @access public      +----------------------------------------------------------     * @param string $image 图像文件名      +----------------------------------------------------------     * @return mixed      +----------------------------------------------------------     */    static function getImageInfo($img) {        $imageInfo = getimagesize($img);        if ($imageInfo !== false) {            $imageType = strtolower(substr(image_type_to_extension($imageInfo[2]), 1));            $imageSize = filesize($img);            $info = array(                "width" => $imageInfo[0],                "height" => $imageInfo[1],                "type" => $imageType,                "size" => $imageSize,                "mime" => $imageInfo['mime']            );            return $info;        } else {            return false;        }    }    /**      +----------------------------------------------------------     * 为图片添加水印      +----------------------------------------------------------     * @static public      +----------------------------------------------------------     * @param string $source 原文件名     * @param string $water  水印图片     * @param string $$savename  添加水印后的图片名     * @param string $alpha  水印的透明度      +----------------------------------------------------------     * @return string      +----------------------------------------------------------     * @throws ThinkExecption      +----------------------------------------------------------     */    static public function water($source, $water, $savename=null, $alpha=80) {        //检查文件是否存在        if (!file_exists($source) || !file_exists($water))            return false;                  //图片信息        $sInfo = self::getImageInfo($source);        $wInfo = self::getImageInfo($water);              //如果图片小于水印图片,不生成图片        if ($sInfo["width"] < $wInfo["width"] || $sInfo['height'] < $wInfo['height'])            return false;                //建立图像        $sCreateFun = "imagecreatefrom" . $sInfo['type'];        $sImage = $sCreateFun($source);        $wCreateFun = "imagecreatefrom" . $wInfo['type'];        $wImage = $wCreateFun($water);        //设定图像的混色模式        imagealphablending($wImage, true);        //图像位置,默认为右下角右对齐        $posY = $sInfo["height"] - $wInfo["height"];        $posX = $sInfo["width"] - $wInfo["width"];        //生成混合图像        imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo['width'], $wInfo['height'], $alpha);        //输出图像        $ImageFun = 'Image' . $sInfo['type'];        //如果没有给出保存文件名,默认为原图像名        if (!$savename) {            $savename = $source;            @unlink($source);        }                //保存图像        $ImageFun($sImage, $savename);        imagedestroy($sImage);        return true;    }    /**      +----------------------------------------------------------     * 生成缩略图      +----------------------------------------------------------     * @static     * @access public      +----------------------------------------------------------     * @param string $image  原图     * @param string $type 图像格式     * @param string $thumbname 缩略图文件名     * @param string $maxWidth  宽度     * @param string $maxHeight  高度     * @param string $position 缩略图保存目录     * @param boolean $interlace 启用隔行扫描      +----------------------------------------------------------     * @return void      +----------------------------------------------------------     */    static function thumb($image, $thumbname, $type='', $maxWidth=200, $maxHeight=50, $interlace=true) {        // 获取原图信息        $info = Image::getImageInfo($image);        if ($info !== false) {            $srcWidth = $info['width'];            $srcHeight = $info['height'];            $type = empty($type) ? $info['type'] : $type;            $type = strtolower($type);            $interlace = $interlace ? 1 : 0;            unset($info);            $scale = min($maxWidth / $srcWidth, $maxHeight / $srcHeight); // 计算缩放比例            if ($scale >= 1) {                // 超过原图大小不再缩略                $width = $srcWidth;                $height = $srcHeight;            } else {                // 缩略图尺寸                $width = (int) ($srcWidth * $scale);                $height = (int) ($srcHeight * $scale);            }            // 载入原图            $createFun = 'ImageCreateFrom' . ($type == 'jpg' ? 'jpeg' : $type);            $srcImg = $createFun($image);            //创建缩略图            if ($type != 'gif' && function_exists('imagecreatetruecolor'))                $thumbImg = imagecreatetruecolor($width, $height);            else                $thumbImg = imagecreate($width, $height);            // 复制图片            if (function_exists("ImageCopyResampled"))                imagecopyresampled($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height, $srcWidth, $srcHeight);            else                imagecopyresized($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height, $srcWidth, $srcHeight);            if ('gif' == $type || 'png' == $type) {                //imagealphablending($thumbImg, false);//取消默认的混色模式                //imagesavealpha($thumbImg,true);//设定保存完整的 alpha 通道信息                $background_color = imagecolorallocate($thumbImg, 0, 255, 0);  //  指派一个绿色                imagecolortransparent($thumbImg, $background_color);  //  设置为透明色,若注释掉该行则输出绿色的图            }            // 对jpeg图形设置隔行扫描            if ('jpg' == $type || 'jpeg' == $type)                imageinterlace($thumbImg, $interlace);            //$gray=ImageColorAllocate($thumbImg,255,0,0);            //ImageString($thumbImg,2,5,5,"ThinkPHP",$gray);            // 生成图片            $imageFun = 'image' . ($type == 'jpg' ? 'jpeg' : $type);            $imageFun($thumbImg, $thumbname);            imagedestroy($thumbImg);            imagedestroy($srcImg);            return $thumbname;        }        return false;    }    }//类定义结束?>
<?phpheader("Content-type:text/html;charset=utf-8");require "UploadFile.class.php"; 
require "Image.class.php";
$upload=new UploadFile();if(!$upload->uploadOne($_FILES['name'],ROOT.'upload/')){$upload->getErrorMsg();}else{ $list=$upload->getUploadFileInfo(); $info=array(); foreach ($list as $val){ $info=$val; } $water=ROOT.'data/logo.png'; $source=$info['savepath'].$info['thumb']; $savename='water'.$info['savename']; if(Image::water($source, $water)){ } var_dump($info); }?>




0 0
原创粉丝点击