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

相关文章

精彩推荐