php添加图片水印乱码

实现一个小功能:上传图片后自动给图片加水印,结果打印出乱码
图片描述

我初步猜测可能是header头的问题,但是不知道怎么解决

下面是关键代码
index.php

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title>ajax实现附件上传</title>
    <meta name="description" content="">
    <meta name="keywords" content="">
    <link href="" rel="stylesheet">
</head>
<script type="text/javascript">
    window.onload= function(){
        var fm = document.getElementsByTagName('form')[0];
        fm.onsubmit = function(evt){
            var url='./upload.php?s='+Math.random();
            var fd = new FormData(this);
            var xhr = new XMLHttpRequest();
            xhr.onreadystatechange = function(){
                if(xhr.readyState == 4){
                    alert(xhr.responseText);
                }
            }
            xhr.open('post',url);
            xhr.send(fd);
            evt.preventDefault();
        }
    }
</script>
<body>
    <h2>无刷新方式实现附件上传</h2>
    <form method="post" action="" enctype="multipart/form-data">
        <input type="file" name="avator">
        <input type="submit" name="submit" value="上传">
    </form>
</body>
</html>

**upload.php**
<?php
/**
 * @authors zhangle (319126583@qq.com)
 * @date    2017-09-04 11:10:21
 */
header('content-type:text/html;charset=utf-8');
require 'config.php';
if(isset($_POST)){
    $myupfile = $_FILES['avator'];
    // $maxsize = 2;
    $arr_mime = ['image/jpeg','image/png','image/gif'];
    $dir = './upload/';
    @mkdir($dir);//创建目录
    $src_file = './logo.gif';  //设置水印图片
    uploadfile($myupfile,$arr_mime,$dir,$src_file);
}else{
    echo "<script>alert('非法上传');location.href='index.php'</script>";
}

config.php

<?php 
function uploadfile($myupfile,$arr_mime,$dir,$src_file){
    if($myupfile['error']){
        switch ($myupfile['error']) {
            case '1':
            echo '文件大小比php.ini中upload_max_filesize指定值要大';
            break;
            case '2':
            echo '文件的小比表单的MAX_FILE_SIZE指定的值大';
            break;
            case '3':
            echo '文件上传不完整(可能因为请求时间过长被终止)';
            break;
            case '4':
            echo '没有文件随着这个请求上传';
            break;
            default:
            echo '未知错误';
            break;
        }
    }
    if(!is_uploaded_file($myupfile['tmp_name'])){
        echo '上传有错误,请重新上传!';
    }else{
        $fs = finfo_open(FILEINFO_MIME_TYPE);
        $mime = finfo_file($fs,$myupfile['tmp_name']);
        $ext = substr($mime,strrpos($mime,'/')+1);
        $name = date('YmdHis').'-'.uniqid().'.'.$ext;
        $dir_name = $dir.$name;
        if(in_array($mime,$arr_mime)){            
            if(move_uploaded_file($myupfile['tmp_name'],$dir_name)){
                echo "上传成功!";
                switch ($ext) {
                    case 'jpeg':
                        $dst_img = imagecreatefromjpeg($dir_name);
                        break;
                    case 'png':
                        $dst_img = imagecreatefrompng($dir_name);
                        break;
                    case 'gif':
                        $dst_img = imagecreatefromgif($dir_name);
                        break;
                    default:
                        break;
                }
                $src_img = imagecreatefromgif($src_file);
                list($src_w, $src_h ) = getimagesize($src_file);
                list($dst_w, $dst_h ) = getimagesize($dir_name);

                $dst_x =  ($dst_w - $src_w)/2;
                $dst_y =  ($dst_h - $src_h)/2;
            
                $src_x = 0;
                $src_y = 0;
                $pct = 50;  //设置水印透明度
                imagecopymerge($dst_img, $src_img, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct);
                ob_clean();
                switch ($ext) {
                    case 'jpeg':
                         header('content-type: image/jpeg'); 
                        imagejpeg($dst_img);
                        break;
                    case 'png':
                        header('content-type:image/png');
                        imagepng($dst_img);
                        break;
                    case 'gif':
                        header('content-type:image/gif');
                        imagegif($dst_img);
                        break;
                    default:
                        break;
                }
                imagedestroy($dst_img);
                imagedestroy($src_img);

            }else{
                echo '上传失败!';
            }
        }else{
            echo '文件类型不正确,请重新上传';
        }
    }
}
阅读 3k
2 个回答

imagepng|* 是输出一个png格式的文件.你把它输出给reponseText不乱码才怪.
也不是这么来的. 你上传成功,水印加好了.把存这个图片的地址返回就行了.为什么去输出源图片(二进制)?

返回来的是二进制文本啊

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题