zl程序教程

您现在的位置是:首页 >  后端

当前栏目

PHP生成验证码时“图像因其本身有错无法显示”的解决方法

PHP方法 解决 生成 无法 显示 图像 验证码
2023-06-13 09:15:04 时间

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

于是深度google,大部分的解决方案也是将“<?”这句代码前的空格回车一切都删掉以防止有html输出,但这根本解决不了我的问题,后来看到有人在Header("Content-type:image/PNG");这句代码前使用ob_clean()清除输出,结果一试之下果然成功。现将原代码修改后贴到下面,以备不时之需:

确认码生成文件checkNum_session.php

复制代码代码如下:

Header("Content-type:image/png");
/*
*初始化
*/
$border=1;//是否要边框1要:0不要
$how=4;//验证码位数
$w=$how*15;//图片宽度
$h=20;//图片高度
$fontsize=6;//字体大小
$alpha="abcdefghijkmnopqrstuvwxyz";//验证码内容1:字母
$number="023456789";//验证码内容2:数字
$randcode="";//验证码字符串初始化
srand((double)microtime()*1000000);//初始化随机数种子
$im=ImageCreate($w,$h);//创建验证图片
/*
*绘制基本框架
*/
$bgcolor=ImageColorAllocate($im,255,255,255);//设置背景颜色
ImageFill($im,0,0,$bgcolor);//填充背景色
if($border)
{
   $black=ImageColorAllocate($im,0,0,0);//设置边框颜色
   ImageRectangle($im,0,0,$w-1,$h-1,$black);//绘制边框
}
/*
*逐位产生随机字符
*/
for($i=0;$i<$how;$i++)
{  
   $alpha_or_number=mt_rand(0,1);//字母还是数字
   $str=$alpha_or_number?$alpha:$number;
   $which=mt_rand(0,strlen($str)-1);//取哪个字符
   $code=substr($str,$which,1);//取字符
   $j=!$i?4:$j+15;//绘字符位置
   $color3=ImageColorAllocate($im,mt_rand(0,100),mt_rand(0,100),mt_rand(0,100));//字符随即颜色
   ImageChar($im,$fontsize,$j,3,$code,$color3);//绘字符
   $randcode.=$code;//逐位加入验证码字符串
}
//把验证码字符串写入session
session_start();
$_SESSION["authnum_session"]=$randcode;
/*
*添加干扰
*/
for($i=0;$i<1;$i++)//绘背景干扰线
{  
   $color1=ImageColorAllocate($im,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));//干扰线颜色
   ImageArc($im,mt_rand(-5,$w),mt_rand(-5,$h),mt_rand(20,300),mt_rand(20,200),55,44,$color1);//干扰线
}  
for($i=0;$i<$how*40;$i++)//绘背景干扰点
{  
   $color2=ImageColorAllocate($im,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));//干扰点颜色
   ImageSetPixel($im,mt_rand(0,$w),mt_rand(0,$h),$color2);//干扰点
}
//关键代码,防止出现"图像因其本身有错无法显示"的问题
ob_clean();
/*绘图结束*/
Imagegif($im);
ImageDestroy($im);
/*绘图结束*/

确认码调用文件sessionValidate.php
复制代码代码如下:

<spanstyle="font-size:14px;"><?php
session_start();
//在页首先要开启session,
//error_reporting(2047);
session_destroy();
//将session去掉,以每次都能取新的session值;
//用seesion效果不错,也很方便
?>
<html>
<head>
<title>session图片验证实例</title>
</head>
<body>
此例为session验证实例
<formaction=""method="post">
验证码:<inputtype="text"name="validate"value=""size=10><imgsrc="checkNum_session.php"><br>
<inputtype="submit">
</form>
<?php
//打印上一个session;
echo"上一个session:<b>".$_SESSION["authnum_session"]."</b><br>";
$validate="";
if(isset($_POST["validate"])){
$validate=$_POST["validate"];
echo"您刚才输入的是:".$_POST["validate"]."<br>状态:";
if($validate!=$_SESSION["authnum_session"]){
//判断session值与用户输入的验证码是否一致;
echo"<fontcolor=red>输入有误</font>";
}else{
echo"<fontcolor=green>通过验证</font>";
}
}
/*
//打印全部session;
PrintArr($_SESSION);
functionPrintArr($aArray){
echo"<xmp>";
print_r($aArray);
echo"</xmp>";
}
*/
?></span>