php 上传类 支持缩略图 打水印

<?php

/***********************

 * @功能 :     可单文件上传亦可多文件上传 可用getSaveInfo()函数调用原图的详细信息  用get_save_thumb()函数调用缩略图的路径信息

 *            可生成缩略图  可预览上传图片 可预览缩略图 可添加图片水印 可添加文字水印  可用时间命名文件  可直接调用

 * @注意事项:    1、 在创建图片文件夹时  会建立一个子文件夹用于存放缩略图

 *             2、水印图片支持jpg gif png 3种

 *             3、本类用到了imagettftext()函数,此函数需要 GD 库和  FreeType 库的支持

 * *****************/

class upClass {

       var $filename=array(); //input name

       var $file_folder='upload/';//原图文件夹

       var $detination='upfile/'; //缩略图文件夹路径

       var $save_path;        //保存路径   带文件名

       var $renames;          //rename为重命名  norename保留原名

       var $save_info = array(); //用于保存原文件信息。

       var $save_thumb=array();

  var $maxsize;          //上传最大尺寸

  var $alltype=array('jpg', 'jpeg','png', 'gif','zip', 'rar');// 文件类型

  var $watermark;        // mark为添加水印  nomark或其他为不添加

  var $watermarktype;    //水印类型 1为图片水印 2为文字水印

       var $waterposition;    //水印位置 1为左上角 2为左下角3为居中 4为右上角 5为右下角

       var $waterstring="";   //水印字符串

       var $logo="";          //水印图片

       var $imgpreview;       //是否预览图片(view_thumb为缩略图,view_original为原图,noview或其他为不预览);

       var $scale=0.5;        //缩略图比例

    function upClass($file,$folder,$path,$renames='norename',$maxsize=2097152,$type='',$imgpreview='noview',$watermark='nomark',$waterstring='',$logo='',$watermarktype=2,$waterposition=5) {

       $this->filename=$file;

       if($folder=''){

       $this->file_folder=$folder;

       }

       if($path=''){

        $this->file_folder.$this->detination=$path;

       }

       $this->maxsize=$maxsize;

       $this->renames=$renames;

       $this->watermark=$watermark;

       $this->watermarktype=$watermarktype;

       $this->logo=$logo;

       $this->waterstring=$waterstring;

       $this->waterposition=$waterposition;

       $this->imgpreview=$imgpreview;

       if($type=''){

        $this->alltype=$type;

       }

   }

   function upfile(){

      for($i=0;$i<count($this->filename['name']);$i++){

      //取当前文件名、临时文件名、大小、扩展名,后面将用到。

      if($this->filename['error'][$i]==0){

      $uname=$this->filename['name'][$i];

      $size=$this->filename['size'][$i];

      $tmpname=$this->filename['tmp_name'][$i];

      $mime_type=$this->filename['type'][$i];

                $type=$this->getFileExt($this->filename['name'][$i]);

            //检测大小

               $this->checksize($size);

            //检测文件类型

               $this->checktype($type);

            //检测是否违法提交

               if(!is_uploaded_file($tmpname)){

                $this->show_error('请选择文件');

                exit();

               }

            //是否重命名

               $basename = $this->getBaseName($uname, ".".$type);

               if($this->renames=='rename'){

     $saveas = $basename."-".time().".".$type; //按时间命名

               }elseif($this->renames=='norename'){

                 $saveas = $basename.".".$type; //覆盖相同文件名

               }

           //组合新文件名再存到指定目录下,格式:存储路径 + 文件名 + 时间 + 扩展名

              if(!file_exists($this->file_folder)){

          mkdir($this->file_folder,0777);

 

           }

        //建立子文件夹 用于存放缩略图

              if(!file_exists($this->file_folder.$this->detination)){

                    mkdir($this->file_folder.$this->detination,0777);

                    }

              $this->save_path= $this->file_folder.$saveas;

          //是否有重复文件

              $this->check_repeat($this->save_path);

          //上传

              if(!move_uploaded_file($tmpname,$this->save_path)){

                $this->show_error('上传失败');

              }

          //保存信息

              $this->save_info[]=array("name"=>$uname,

                                       "type"=>$type,

                                       "mime_type"=>$mime_type,

                                       "size"=>$size,

                                       "saveas" => $saveas,

                                       "path"=>$this->save_path);

 

        //是否添加水印

             if($this->watermark=='mark'){

               $viewarr= $this->getSaveInfo();

               //echo count($viewarr);

               $img=$viewarr[$i][path];

               $this->imgmark_add($img,$this->logo,$this->watermarktype,$this->waterposition);

             }

        //是否预览

             if($this->imgpreview=='view_thumb'){  //浏览缩略图

               $viewarr= $this->getSaveInfo();

               $view=$this->file_folder.$this->detination.$viewarr[$i][saveas];

                if(!file_exists($view)){

                $this->show_error('您未开启缩略图,如您不需要缩略图,请设置为浏览原图view_original');

                }

               $this->view($view);

             }elseif($this->imgpreview=='view_original'){ //浏览原图

              $viewarr= $this->getSaveInfo();

               $view=$viewarr[$i][path];

               $this->view($view);

             }

      }

      }

        return count($this->save_info);

   }

 

 //==========================

 //检测文件大小

   function checksize($size){

    if($size > $this->filename){

    $this->show_error('文件太大');

    //exit();

    }

   }

//检测文件类型

  function checktype($type){

     if(!in_array($type,$this->alltype)){

      $this->show_error('文件类型不符');

      //exit();

     }

  }

//取得扩展名

  function getFileExt($filename){

$stuff = pathinfo($filename);

return $stuff['extension'];

}

//取得给定文件文件名,不包括扩展名。

  function getBaseName($filename, $type)

{

$basename = basename( $filename, $type);

//将中文名的编码换成gb2312的   防止中文乱码

//$basename = basename( iconv("UTF-8","gb2312",$filename), $type);

return $basename;

}

//检测是否有重名文件

   function check_repeat($saveas){

    if(file_exists($saveas)){

    $this->show_error('文件已存在');

    }

   }

//保存原图信息

  function getSaveInfo(){

return $this->save_info;

}

//保存缩略图信息

  function get_save_thumb(){

    return $this->save_thumb;

  }

//出错信息

  function show_error($str){

  echo "<script language='javascript'>;alert('$str');history:location=go(-1);</script>";

  }

//预览

  function view($view){

    $imgpreviewsize=1;  //缩略图比例

    $imgsize=@getimagesize($view);//取得文件尺寸和类型

    $showtime=date("Y-m-d H:i:s");

     echo "<br>图片预览:<br>";

     echo "<img src=/"".$view."/" width=".($imgsize[0]*$imgpreviewsize)." height=".($imgsize[1]*$imgpreviewsize)."><br>";

     echo "尺寸:".$imgsize[0]*$imgpreviewsize."X".$imgsize[1]*$imgpreviewsize."<br>";

     echo "<br>文件名:".$view."/r上传时间:".$showtime."<br>";

  }

//添加水印

  function imgmark_add($img,$logo,$watermarktype,$waterposition){

  //原图

     $imginfo=GetImageSize($img); //首先取得文件尺寸和类型

       switch($imginfo[2]){  //输出图片的格式

          case 1:

            $im=@ImageCreateFromGIF($img);

           break;

           case 2:

            $im=@ImageCreateFromJPEG($img);

           break;

          case 3:

            $im=@ImageCreateFromPNG($img);

           break;

          default:

           $this->show_error("不支持的原图文件类型");

        }

   //水印图片

        $ing=GetImageSize($logo); //首先取得文件尺寸和类型

  switch($ing[2]){   //输出图片的格式

  case 1:

  $in=@ImageCreateFromGIF($logo);

  break;

   case 2:

  $in=@ImageCreateFromJPEG($logo);

  break;

  case 3:

  $in=@ImageCreateFromPNG($logo);

  break;

            default:

             die("不支持的水印文件类型");

             exit;

        }

        $im_w=$imginfo[0];

      $im_h=$imginfo[1];

      $ing_w=$ing[0];

      $ing_h=$ing[1];

      $str_x=strlen($this->waterstring);

       switch($waterposition){

         case 1:                //左上角

            //=====图片水印坐标

            $w_x=10;

            $h_x=5;

            //=====文字水印坐标

            $x=10;

            $y=30;

             break;

          case 2:               //左下角

            //=====图片水印坐标

            $w_x=10;

            $h_x=$im_h-$ing_h-5;

            //=====文字水印坐标

            $x=10;

            $y=$imginfo[1]-15;

             break;

          case 3:               //居中

            //=====图片水印坐标

            $w_x=($im_w-$ing_w)/2;

            $h_x=($im_h-$ing_h)/2;

            //======文字水印坐标

            $x=($imginfo[0]-$str_x)/2;

            $y=($imginfo[1]-5)/2;

             break;

          case 4:              //右上角

            //=====图片水印坐标

            $w_x=$im_w-$ing_w-10;

            $h_x=5;

            //======文字水印坐标

            $x=$imginfo[0]-$str_x-130;

            $y=30;

             break;

          case 5:              //右下角

            //=====图片水印坐标

            $w_x=$im_w-$ing_w-10;

            $h_x=$im_h-$ing_h-5;

            //======文字水印坐标

            $x=$imginfo[0]-$str_x-130;

            $y=$imginfo[1]-30;

             break;

       }

       switch($watermarktype){

      case 1:      //图片水印

          imagecopy($im,$in,$w_x,$h_x,0,0,$ing[0],$ing[1]);//将logo复制到大图上

          $cname=$this->getSaveInfo();

          for($k=0;$k<count($cname);$k++){

             $newimg=$this->file_folder.$this->detination.$cname[$k][saveas]; //设置缩略图的名称和路径

             $this->save_thumb[]=array("saveas" => $this->file_folder.$this->detination.$cname[$k][saveas]);//保存路径和名称

    $newimage=ImageCreateTrueColor($imginfo[0]*$this->scale,$imginfo[1]*$this->scale);//建立一个空真彩图

    ImageCopyResized($newimage,$im,0,0,0,0,$imginfo[0]*$this->scale,$imginfo[1]*$this->scale,$imginfo[0],$imginfo[1]);

          Imagejpeg($newimage,$newimg); // 生成新图片

             imagedestroy($newimage);//销毁图像

          }

          break;

      case 2:       //文字水印

         $te=imagecolorallocate($im,255,255,255);//建立一个空真彩图

         imagettftext($im,20,0,$x,$y,$te,'Consolas.ttf',iconv("GBK","UTF-8",$this->waterstring)); //将文字写到大图上

            $cname=$this->getSaveInfo();

          for($k=0;$k<count($cname);$k++){

            $newname=$this->file_folder.$this->detination.$cname[$k][saveas]; // 设置缩略图的名称和路径

            $this->save_thumb[]=array("saveas" => $this->file_folder.$this->detination.$cname[$k][saveas]);//保存路径和名称

    $newimage=ImageCreateTrueColor($imginfo[0]*$this->scale,$imginfo[1]*$this->scale);//建立一个空真彩图

    ImageCopyResized($newimage,$im,0,0,0,0,$imginfo[0]*$this->scale,$imginfo[1]*$this->scale,$imginfo[0],$imginfo[1]);

          Imagejpeg($newimage,$newname); // 生成新图片

          imagedestroy($newimage);//销毁图像

          }

          break;

        case 3:     //只生成缩略图

           $cname=$this->getSaveInfo();

          for($k=0;$k<count($cname);$k++){

            $newname=$this->file_folder.$this->detination.$cname[$k][saveas]; //设置缩略图的名称和路径

            $this->save_thumb[]=array("saveas" => $this->file_folder.$this->detination.$cname[$k][saveas]);//保存路径和名称

    $newimage=ImageCreateTrueColor($imginfo[0]*$this->scale,$imginfo[1]*$this->scale);//建立一个空真彩图

    ImageCopyResized($newimage,$im,0,0,0,0,$imginfo[0]*$this->scale,$imginfo[1]*$this->scale,$imginfo[0],$imginfo[1]);

          Imagejpeg($newimage,$newname); // 生成新图片

          imagedestroy($newimage);//销毁图像

          }

          break;

      }

    }

 

}

// end CLASS

/****************演示************************/

if($_POST[Submit]!=''){

     $files=$_FILES[user];

     /*******************************

      * @$file            是$_FILES[filename]

      * @$folder          存放图片的路径  默认upload/

      * @$path            存放缩略图片的路径 默认upfile/

      * @$renames         等于'rename'时重命名,等于norename时保留原来的名称,并覆盖同名文件

      * @$maxsize=2097152 上传文件最大值

      * @$type            文件类型

      * @$imgpreview      view_thumb为缩略图,view_original为原图,noview或其他为不预览

      * @$watermark       等于'mark'时添加水印

      * @$waterstring     文字水印的内容,

      * @$logo            水印图片

      * @$watermarktype=2 水印类型  1为图片水印 2为文字水印 3为无水印(只是缩略图)

      * @$waterposition=5 水印位置 1为左上角 2为左下角3为居中 4为右上角 5为右下角

      * *****************************/

     $up=new upClass($files,$folder,$path,'norename',1000000,$type,'view_original','nomark','beijing','upload/logo.jpg',3,5);

     $num=$up->upfile();

     if($num!=0){ //如果上传的文件不是0个

       //$up->show_error('上传成功');

       echo "上传成功";

     }

     $in=$up->get_save_thumb(); //缩略图文件信息

      // print_r($in);

  }

?>

<form name='form1' action='' method='post' enctype='multipart/form-data'>

<table width="60%" border="0" cellspacing="1" cellpadding="0" align="center">

<tr>

<td align='left'>

<input type='file' name='user[]' class='input1'>(只能上传GIF/JPEG图片,文件不能大于500K)<br />

<input type='file' name='user[]' class='input1'><br />

<input type="checkbox" value="1" name="check">要生成缩略图吗<br />

<input type='submit' name='Submit' value='开始上传' class='input2'>

<input name="action" type="hidden" id="action" value="3">

</td>

</tr>

</table>

</form>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值