-
PHP文件上传与上传图片加水印例子
文章介绍的PHP文件上传与上传图片加水印例子是分开来写的了,先是介绍文件上传代码,而后介绍了一个上传图片加水印代码,大家可以整理成一个类来方便调用了.
先来看一段简单的文件上传代码,html文件,主要是表单了上传文件的表单了,代码如下:
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <!-- 此行定义字符集,在使用汉字的国家,字符集通常有 gb2312,utf-8两种字符集,设置不对会导致页面中文乱码
- 因为我的编辑器是utf-8的,所以这里我定义字符集为utf-8。如果你的字符集是gb2312可以修改charset值 -->
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <!-- 此行多是IE浏览器不兼容导致的,现在IE6,IE7使用的人数不多了,大多数可以忽略 -->
- <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
- <!-- 定义文档标题 -->
- <title>PHP上传实例</title>
- <!-- 加入js脚本,简单的前端判断,防止没有选择上传文件就点击提交 -->
- <script type="text/javascript">
- // 当页面加载完后执行里边的函数体
- // 因为页面的加载顺序是自上到下,否则你把JS移到页脚也可以
- window.onload = function(){
- // 给上传按钮添加鼠标单击事件
- document.forms[0].elements[1].onclick = function(){
- // 判断要上传的文件名是否为空
- if( document.forms[0].file.value == '' ){
- // 如果是空则弹出警告
- alert('请先选择文件');
- // 结束脚本运行
- return;
- }
- // 如果文件不为空则上传文件
- document.forms[0].submit();
- }
- }
- </script>
- </head>
- <body>
- <!-- 此行是定义form表单区域,上传文件必须用POST方式,还要添加 enctype="multipart/form-data" 属性
- action里的值为你要处理上传文件的页面,也可以用url或者相对路径 -->
- <form action="upload.php" method="post" enctype="multipart/form-data">
- <!-- 定义选择文件的浏览表单 value属性里值就是显示在按钮上的值 -->
- <input type="file" name="file" value="选择要上传的文件" />
- <!-- 定义提交到服务器的按钮 value属性里的值就是显示在按钮上的值 -->
- <input type="button" value="上传" />
- </form>
- </body>
- </html>
php上传处理文件,代码如下:
- <?php
- /**
- * PHP文件上传处理页面
- * 琼台博客
- */
- // 定义提示函数
- function alert($msg){
- return '<script type="text/javascript">alert("'.$msg.'");window.history.back(-1);</script>';
- }
- // 定义允许的文件类型
- $allowType = array('image/jpeg','image/gif','image/jpg');
- // 定义路径,可以是绝对路径,或者相对路径都可以
- $filePath = './uploadFileDir/';
- // 接收表单信息 其中里边写的 file 值是 静态页form表单里的name值
- $file = $_FILES['file'];
- // 第一步,判断上传的文件是否有错误
- if( $file['error'] !== 0 ){
- exit(alert('文件上传错误'));
- }
- // 第二步,判断文件大小,这里的102400是字节,换算为kb就是100kb
- if( $file['size'] > 102400 ){
- exit(alert('文件过大'));
- }
- // 第三步,判断文件类型
- if( !in_array(mime_content_type($file['tmp_name']),$allowType) ){
- exit(alert('文件类型错误'));
- }
- // 第四步,判断路径是否存在,如果不存在则创建
- if( !file_exists($filePath) && !mkdir($filePath,0777,true) ){
- exit(alert('创建目录错误'));
- }
- // 第五步,定义上传后的名字及路径
- $filename = time().'_'.$file['name'];
- // 第六步,复制文件
- if( !copy($file['tmp_name'],$filePath.$filename) ){
- exit(alert('上传文件出错,请稍候重试'));
- }
- // 第七步,删除临时文件
- unlink($file['tmp_name']);
- // 提示上传成功
- //开源代码phpfensi.com
- echo alert('恭喜,上传文件['.$filename.']成功!');
- ?>
注意:如果你在上传中还带有其它单表字段名我们需要获取需要利用post接受才可以,否则你可能接受不到值.
完成以上步骤以后,你就可以给你上传的图片添加水印了,以下是我写的一个小DEMO水印类,代码如下:
- <?php
- /**
- * 加水印类
- * 琼台博客
- */
- class water{
- private $imgPath; // 图片路径
- public function __construct($imgPath="./"){
- $this->imgPath = rtrim($imgPath,"/")."/";
- }
- // 写水印动作
- public function waterInfo($ground,$water,$pos=0,$prefix="lee_",$tm=50){
- $allPathGround = $this->imgPath.$ground;
- $allPathWater = $this->imgPath.$water;
- $groundInfo = $this->imgInfo($allPathGround);
- $waterInfo = $this->imgInfo($allPathWater);
- //判断水印图片是否比原图大
- if(!$newPos=$this->imgPos($groundInfo,$waterInfo,$pos)){
- echo "您的水印图片比原图大哦";
- return false;
- }
- //打开资源
- $groundRes=$this->imgRes($allPathGround,$groundInfo['mime']);
- $waterRes=$this->imgRes($allPathWater,$waterInfo['mime']);
- //整合资源
- $newGround=$this->imgCopy($groundRes,$waterRes,$newPos,$waterInfo,$tm);
- //保存资源
- $this->saveImg($newGround,$ground,$groundInfo['mime'],$prefix);
- }
- private function saveImg($img,$ground,$info,$prefix){
- $path=$this->imgPath.$prefix.$ground;
- switch($info){
- case "image/jpg":
- case "image/jpeg":
- case "image/pjpeg":
- imagejpeg($img,$path);
- break;
- case "image/gif":
- imagegif($img,$path);
- break;
- case "image/png":
- imagepng($img,$path);
- break;
- default:
- imagegd2($img,$path);
- }
- }
- private function imgCopy($ground,$water,$pos,$waterInfo,$tm){
- imagecopymerge($ground,$water,$pos[0],$pos[1],0,0,$waterInfo[0],$waterInfo[1],$tm);
- return $ground;
- }
- private function imgRes($img,$imgType){
- switch($imgType){
- case "image/jpg":
- case "image/jpeg":
- case "image/pjpeg":
- $res=imagecreatefromjpeg($img);
- break;
- case "image/gif":
- $res=imagecreatefromgif($img);
- break;
- case "image/png":
- $res=imagecreatefrompng($img);
- break;
- case "image/wbmp":
- $res=imagecreatefromwbmp($img);
- break;
- default:
- $res=imagecreatefromgd2($img);
- }
- return $res;
- }
- // 位置为
- // 1 左上 2中上 3右上
- // 4 左中 5中中 6右中
- // 7 左下 8中下 9右下
- // 0 随机位置
- private function imgPos($ground,$water,$pos){
- if($ground[0]<$water[0] || $ground[1]<$water[1]) //判断水印与原图比较 如果水印的高或者宽比原图小 将返回假
- return false;
- switch($pos){
- case 1:
- $x=0;
- $y=0;
- break;
- case 2:
- $x=ceil(($ground[0]-$water[0])/2);
- $y=0;
- break;
- case 3:
- $x=$ground[0]-$water[0];
- $y=0;
- break;
- case 4:
- $x=0;
- $y=ceil(($ground[1]-$water[1])/2);
- break;
- case 5:
- $x=ceil(($ground[0]-$water[0])/2);
- $y=ceil(($ground[1]-$water[1])/2);
- break;
- case 6:
- $x=$ground[0]-$water[0];
- $y=ceil(($ground[1]-$water[1])/2);
- break;
- case 7:
- $x=0;
- $y=$ground[1]-$water[1];
- break;
- case 8:
- $x=ceil($ground[0]-$water[0]/2);
- $y=$ground[1]-$water[1];
- break;
- case 9:
- $x=$ground[0]-$water[0];
- $y=$ground[1]-$water[1];
- break;
- case 0:
- default:
- $x=rand(0,$ground[0]-$water[0]);
- $y=rand(0,$ground[1]-$water[1]);
- }
- $xy[]=$x;
- $xy[]=$y;
- return $xy;
- }
- // 获取图片信息的函数
- private function imgInfo($img){
- return getimagesize($img);
- }
- }
- ?>
用法很简单,我们介绍一下原理吧,我们只要创建一个water类就可以了,非常的简单.例子代码如下:
- if( !copy($file['tmp_name'],$filePath.$filename) ){
- exit(alert('上传文件出错,请稍候重试'));
- }
如果文件上传成功之后我们可以用如下代码:
- $wt = new sater();
- $water ='a.gif'; //水印图片
- $wt->waterInfo($filePath.$filename,$water) //其它默认就可以了
出处:http://www.phpfensi.com/php/20140818/4407.html
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式