当前位置:首页 > PHP教程 > php图像处理 > 列表

PHP文件上传与上传图片加水印例子

发布:smiling 来源: PHP粉丝网  添加日期:2014-08-18 14:42:31 浏览: 评论:0 

文章介绍的PHP文件上传与上传图片加水印例子是分开来写的了,先是介绍文件上传代码,而后介绍了一个上传图片加水印代码,大家可以整理成一个类来方便调用了.

先来看一段简单的文件上传代码,html文件,主要是表单了上传文件的表单了,代码如下:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
  2.  
  3. <html xmlns="http://www.w3.org/1999/xhtml"> 
  4.  
  5.     <head> 
  6.  
  7.         <!-- 此行定义字符集,在使用汉字的国家,字符集通常有 gb2312,utf-8两种字符集,设置不对会导致页面中文乱码 
  8.  
  9.                  因为我的编辑器是utf-8的,所以这里我定义字符集为utf-8。如果你的字符集是gb2312可以修改charset值 --> 
  10.  
  11.         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
  12.  
  13.         <!-- 此行多是IE浏览器不兼容导致的,现在IE6,IE7使用的人数不多了,大多数可以忽略 --> 
  14.  
  15.         <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /> 
  16.  
  17.         <!-- 定义文档标题 --> 
  18.  
  19.         <title>PHP上传实例</title> 
  20.  
  21.         <!-- 加入js脚本,简单的前端判断,防止没有选择上传文件就点击提交 --> 
  22.  
  23.         <script type="text/javascript">     
  24.  
  25.             // 当页面加载完后执行里边的函数体 
  26.  
  27.               // 因为页面的加载顺序是自上到下,否则你把JS移到页脚也可以 
  28.  
  29.             window.onload = function(){ 
  30.  
  31.                 // 给上传按钮添加鼠标单击事件 
  32.  
  33.                 document.forms[0].elements[1].onclick = function(){ 
  34.  
  35.                     // 判断要上传的文件名是否为空 
  36.  
  37.                     if( document.forms[0].file.value == '' ){ 
  38.  
  39.                         // 如果是空则弹出警告 
  40.  
  41.                         alert('请先选择文件');     
  42.  
  43.                         // 结束脚本运行 
  44.  
  45.                         return; 
  46.  
  47.                     } 
  48.  
  49.  
  50.  
  51.                     // 如果文件不为空则上传文件 
  52.  
  53.                     document.forms[0].submit(); 
  54.  
  55.                 }         
  56.  
  57.             } 
  58.  
  59.         </script> 
  60.  
  61.     </head> 
  62.  
  63.     <body> 
  64.  
  65.         <!-- 此行是定义form表单区域,上传文件必须用POST方式,还要添加 enctype="multipart/form-data" 属性 
  66.  
  67.              action里的值为你要处理上传文件的页面,也可以用url或者相对路径 --> 
  68.  
  69.         <form action="upload.php" method="post"  enctype="multipart/form-data"> 
  70.  
  71.             <!-- 定义选择文件的浏览表单 value属性里值就是显示在按钮上的值 --> 
  72.  
  73.             <input type="file" name="file" value="选择要上传的文件" /> 
  74.  
  75.             <!-- 定义提交到服务器的按钮 value属性里的值就是显示在按钮上的值 --> 
  76.  
  77.             <input type="button" value="上传" /> 
  78.  
  79.         </form> 
  80.  
  81.     </body> 
  82.  
  83. </html> 

php上传处理文件,代码如下:

  1. <?php 
  2.  
  3. /** 
  4.  
  5.  * PHP文件上传处理页面 
  6.  
  7.  * 琼台博客 
  8.  
  9.  */ 
  10.  
  11. // 定义提示函数 
  12.  
  13. function alert($msg){ 
  14.  
  15.     return '<script type="text/javascript">alert("'.$msg.'");window.history.back(-1);</script>'
  16.  
  17.  
  18. // 定义允许的文件类型 
  19.  
  20. $allowType = array('image/jpeg','image/gif','image/jpg'); 
  21.  
  22. // 定义路径,可以是绝对路径,或者相对路径都可以 
  23.  
  24. $filePath  = './uploadFileDir/'
  25.  
  26. // 接收表单信息 其中里边写的 file 值是 静态页form表单里的name值 
  27.  
  28. $file = $_FILES['file']; 
  29.  
  30. // 第一步,判断上传的文件是否有错误 
  31.  
  32. if$file['error'] !== 0 ){ 
  33.  
  34.     exit(alert('文件上传错误')); 
  35.  
  36.  
  37. // 第二步,判断文件大小,这里的102400是字节,换算为kb就是100kb 
  38.  
  39. if$file['size'] > 102400 ){ 
  40.  
  41.     exit(alert('文件过大')); 
  42.  
  43.  
  44. // 第三步,判断文件类型 
  45.  
  46. if( !in_array(mime_content_type($file['tmp_name']),$allowType) ){ 
  47.  
  48.     exit(alert('文件类型错误')); 
  49.  
  50.  
  51. // 第四步,判断路径是否存在,如果不存在则创建 
  52.  
  53. if( !file_exists($filePath) &&  !mkdir($filePath,0777,true) ){ 
  54.  
  55.     exit(alert('创建目录错误')); 
  56.  
  57.  
  58. // 第五步,定义上传后的名字及路径 
  59.  
  60. $filename = time().'_'.$file['name']; 
  61. // 第六步,复制文件 
  62.  
  63. if( !copy($file['tmp_name'],$filePath.$filename) ){ 
  64.  
  65.     exit(alert('上传文件出错,请稍候重试')); 
  66.  
  67. // 第七步,删除临时文件 
  68.  
  69. unlink($file['tmp_name']); 
  70. // 提示上传成功 
  71. //开源代码phpfensi.com 
  72. echo alert('恭喜,上传文件['.$filename.']成功!'); 
  73. ?> 

注意:如果你在上传中还带有其它单表字段名我们需要获取需要利用post接受才可以,否则你可能接受不到值.

完成以上步骤以后,你就可以给你上传的图片添加水印了,以下是我写的一个小DEMO水印类,代码如下:

  1. <?php 
  2. /** 
  3.  * 加水印类 
  4.  * 琼台博客 
  5.  */ 
  6.  
  7. class water{ 
  8.  
  9.     private $imgPath// 图片路径 
  10.       
  11.     public function __construct($imgPath="./"){ 
  12.         $this->imgPath = rtrim($imgPath,"/")."/"
  13.     } 
  14.  
  15.     // 写水印动作 
  16.     public function waterInfo($ground,$water,$pos=0,$prefix="lee_",$tm=50){ 
  17.         $allPathGround  = $this->imgPath.$ground
  18.         $allPathWater   = $this->imgPath.$water
  19.         $groundInfo = $this->imgInfo($allPathGround);     
  20.         $waterInfo  = $this->imgInfo($allPathWater); 
  21.  
  22.         //判断水印图片是否比原图大 
  23.         if(!$newPos=$this->imgPos($groundInfo,$waterInfo,$pos)){ 
  24.             echo "您的水印图片比原图大哦";      
  25.             return false; 
  26.         } 
  27.           
  28.         //打开资源 
  29.         $groundRes=$this->imgRes($allPathGround,$groundInfo['mime']); 
  30.         $waterRes=$this->imgRes($allPathWater,$waterInfo['mime']); 
  31.  
  32.         //整合资源 
  33.         $newGround=$this->imgCopy($groundRes,$waterRes,$newPos,$waterInfo,$tm); 
  34.  
  35.         //保存资源 
  36.         $this->saveImg($newGround,$ground,$groundInfo['mime'],$prefix); 
  37.  
  38.     } 
  39.  
  40.     private function saveImg($img,$ground,$info,$prefix){ 
  41.         $path=$this->imgPath.$prefix.$ground
  42.         switch($info){ 
  43.             case "image/jpg":    
  44.             case "image/jpeg"
  45.             case "image/pjpeg"
  46.                 imagejpeg($img,$path); 
  47.                 break
  48.             case "image/gif"
  49.                 imagegif($img,$path); 
  50.                 break
  51.             case "image/png"
  52.                 imagepng($img,$path); 
  53.                 break
  54.             default
  55.                 imagegd2($img,$path);    
  56.         }    
  57.     } 
  58.  
  59.     private function imgCopy($ground,$water,$pos,$waterInfo,$tm){    
  60.         imagecopymerge($ground,$water,$pos[0],$pos[1],0,0,$waterInfo[0],$waterInfo[1],$tm); 
  61.             return $ground
  62.     } 
  63.  
  64.     private function imgRes($img,$imgType){ 
  65.         switch($imgType){ 
  66.             case "image/jpg":    
  67.             case "image/jpeg"
  68.             case "image/pjpeg"
  69.                 $res=imagecreatefromjpeg($img); 
  70.                 break
  71.             case "image/gif"
  72.                 $res=imagecreatefromgif($img); 
  73.                 break
  74.             case "image/png"
  75.                 $res=imagecreatefrompng($img); 
  76.                 break
  77.             case "image/wbmp"
  78.                 $res=imagecreatefromwbmp($img); 
  79.                 break
  80.             default
  81.                 $res=imagecreatefromgd2($img); 
  82.         }    
  83.         return $res
  84.     } 
  85.  
  86.     // 位置为 
  87.     // 1 左上 2中上 3右上 
  88.     // 4 左中 5中中 6右中 
  89.     // 7 左下 8中下 9右下 
  90.     // 0 随机位置 
  91.     private function imgPos($ground,$water,$pos){ 
  92.         if($ground[0]<$water[0] || $ground[1]<$water[1])  //判断水印与原图比较 如果水印的高或者宽比原图小 将返回假 
  93.             return false; 
  94.         switch($pos){ 
  95.             case 1: 
  96.                 $x=0; 
  97.                 $y=0; 
  98.                 break
  99.             case 2: 
  100.                 $x=ceil(($ground[0]-$water[0])/2); 
  101.                 $y=0; 
  102.                 break
  103.             case 3:  
  104.                 $x=$ground[0]-$water[0]; 
  105.                 $y=0; 
  106.                 break
  107.             case 4: 
  108.                 $x=0; 
  109.                 $y=ceil(($ground[1]-$water[1])/2); 
  110.                 break
  111.             case 5: 
  112.                 $x=ceil(($ground[0]-$water[0])/2); 
  113.                 $y=ceil(($ground[1]-$water[1])/2); 
  114.                 break
  115.             case 6: 
  116.                 $x=$ground[0]-$water[0]; 
  117.                 $y=ceil(($ground[1]-$water[1])/2); 
  118.                 break
  119.             case 7: 
  120.                 $x=0; 
  121.                 $y=$ground[1]-$water[1]; 
  122.                 break
  123.             case 8: 
  124.                 $x=ceil($ground[0]-$water[0]/2); 
  125.                 $y=$ground[1]-$water[1]; 
  126.                 break
  127.             case 9: 
  128.                 $x=$ground[0]-$water[0]; 
  129.                 $y=$ground[1]-$water[1]; 
  130.                 break
  131.             case 0: 
  132.             default
  133.                 $x=rand(0,$ground[0]-$water[0]); 
  134.                 $y=rand(0,$ground[1]-$water[1]); 
  135.         } 
  136.         $xy[]=$x
  137.         $xy[]=$y
  138.         return $xy;  
  139.     } 
  140.  
  141.     // 获取图片信息的函数 
  142.     private function imgInfo($img){ 
  143.         return getimagesize($img);   
  144.     } 
  145. ?>   

用法很简单,我们介绍一下原理吧,我们只要创建一个water类就可以了,非常的简单.例子代码如下:

  1. if( !copy($file['tmp_name'],$filePath.$filename) ){ 
  2.  
  3.     exit(alert('上传文件出错,请稍候重试')); 
  4.  

如果文件上传成功之后我们可以用如下代码:

  1. $wt = new sater(); 
  2. $water ='a.gif'//水印图片 
  3. $wt->waterInfo($filePath.$filename,$water//其它默认就可以了 

Tags: PHP文件上传 PHP传图片

分享到: