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

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

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

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

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

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

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

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

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

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

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

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

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