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

作者:袖梨 2022-06-24

先来看一段简单的文件上传代码

html文件(主要是表单了上传文件的表单了)

代码如下 复制代码

















PHP上传实例

























php上传处理文件

代码如下 复制代码

/**

* PHP文件上传处理页面

* 琼台博客

*/



// 定义提示函数

function alert($msg){

return '';

}



// 定义允许的文件类型

$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']);



// 提示上传成功

echo alert('恭喜,上传文件['.$filename.']成功!');



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

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

代码如下 复制代码

/**
* 加水印类
* 琼台博客
*/

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] 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) //其它默认就可以了。

相关文章

精彩推荐