解决PHP生成验证码无法显示的问题

小天天天天    PHP    999+ 次    2017-05-08 03:22:31


今天使用代码进行PHP生成校验码功能的实现,发现firefox一直提示“图像.......因其本身有错无法显示”的问题,作者也提示了说“如果浏览器显示“图像XXX因其本身有错无法显示”,可尽量去掉文中空格”,但把代码中所有空格都去掉了还是不能显示检验图片。

网上大部分的解决方案也是将“<?”这句代码前的空格回车一切都删掉以防止有html输出,但这根本解决不了我的问题,

后来看到有人在这句代码前使用ob_clean()清除输出,结果一试之下果然成功。

现将原代码修改后贴到下面,以备不时之需:

(请仔细阅读createCold方法)

class validCode{
    //可以控制产生几个字符!
    private $width = 0;
    private $height = 0;
    function createCode(){
        //$width = 20 + 10*$len;
        //$img1 = ImageCreateTrueColor($width,20);
         header("content-type:image/png");//也可以是jpeg,或png
        $n = rand(1,5);
        $type =rand(1,2);
        if($type == 1){
            $img1 = imageCreateFromgif("./web/back/images/captcha_bg{$n}.gif");
        }
        else{
            $img1 = imageCreateFromjpeg("./web/back/images/captcha_bg{$n}.jpg");
        }
        $this->width = imagesx($img1);
        $this->height = imagesy($img1);

        $color2 = ImageColorAllocate($img1, rand(0,255),rand(0,255),rand(0,255));

        $this->AddGanrao($img1, $color2);//画干扰线

        $validCode = $this->getValidCode();//获得字符
        imagestring($img1, 10, 40,3, $validCode, $color2);//写字符

        //下面这个函数是重点!!!!!!!!!!!!
        ob_clean();
        ImagePng($img1);

        imagedestroy($img1);
        
        return $validCode;
    }

    //添加干扰 点 线
    private function AddGanrao($img, $color){
        //添加6个干扰线
        for($i = 1; $i < 4; $i++){
            $x1 = rand(0,$this->width-1);
            $y1 = rand(0,$this->height-1);
            $x2 = rand(0,$this->width-1);
            $y2 = rand(0,$this->height-1);
            imageLine($img, $x1,$y1, $x2, $y2, $color);
        }
    }

    private function getValidCode(){
        $arr=array("+","-","*");
        $num1=rand(1000,9999);
        $oper=$arr[rand(1,4)];
        $num2=rand(1000,9999);
        $str1=$num1.$oper.$num2;
        switch($oper){
            case "+":
            $_SESSION['code'] = $num1+$num2;    //存入session中,以备登录验证时使用!
            break;
            case "-":
            $_SESSION['code'] = $num1-$num2;    //存入session中,以备登录验证时使用!
            break;
            case "*":
            $_SESSION['code'] = $num1*$num2;    //存入session中,以备登录验证时使用!
            break;
        }
        return $str1;
    }



如果你觉得本篇文章对您有帮助,请打赏作者

上一篇: session的一些细节知识

下一篇: 递归思想下的无限级分类的实现

最新评论

暂无评论

热门文章

最新评论

网站数据

网站文章数:481

今日UV/PV/IP:1/1/1

昨日UV/PV/IP:27/39 /26

TOP