PHP生成验证码时“图像因其本身有错无法显示”的解决方法
发布时间:2020-12-13 06:31:55 所属栏目:PHP教程 来源:网络整理
导读:今天使用代码进行PHP生成校验码功能的实现,发现firefox一直提示“图像.......因其本身有错无法显示”的问题,作者也提示了说“如果浏览器显示“图像XXX因其本身有错无法显示”,可尽量去掉文中空格”,但把代码中所有空格都去掉了还是不能显示检验图片。于
今天使用代码进行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); //设置背景颜色 ImageFill($im,$bgcolor); //填充背景色 if($border) { $black = ImageColorAllocate($im,0); //设置边框颜色 ImageRectangle($im,$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),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,255),255)); //干扰线颜色 ImageArc($im,mt_rand(-5,$w),$h),mt_rand(20,300),200),55,44,$color1); //干扰线 } for($i=0; $i<$how*40; $i++)//绘背景干扰点 { $color2 = ImageColorAllocate($im,255)); //干扰点颜色 ImageSetPixel($im,$color2); //干扰点 } //关键代码,防止出现'图像因其本身有错无法显示'的问题 ob_clean(); /*绘图结束*/ Imagegif($im); ImageDestroy($im); /*绘图结束*/ 确认码调用文件sessionValidate.php 代码如下: session_start(); //在页首先要开启session, //error_reporting(2047); session_destroy(); //将session去掉,以每次都能取新的session值; //用seesion 效果不错,也很方便 ?> 此例为session验证实例 //打印上一个session; echo "上一个session:".$_SESSION["authnum_session"]." "; $validate=""; if(isset($_POST["validate"])){ $validate=$_POST["validate"]; echo "您刚才输入的是:".$_POST["validate"]." 状态:"; if($validate!=$_SESSION["authnum_session"]){ //判断session值与用户输入的验证码是否一致; echo "输入有误"; }else{ echo "通过验证"; } } /* //打印全部session; PrintArr($_SESSION); function PrintArr($aArray){ echo ' print_r($aArray); echo ' } */ ?> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |