PHP(TinkPHP\PHPCMS)等验证码图片不显示问题已解决

场景:

今天线下写好的程序,两个人开发,经过[GitEE]码云合并之后现在部署了一套在服务器,但是验证码总是碎图不展示。XDebug、PHP、apache均无错误信息。

经搜索,验证码最后用的

ob_start();
// 输出图像
imagepng($this->im);
$content = ob_get_clean();
imagedestroy($this->im);

return response($content, 200, ['Content-Length' => strlen($content)])->contentType('image/png');

缓冲区获取生成的png图片内容返回输出

问题原因:

1、代码(包括vender composer扩展)中有BOM头文件,自己的文件可能性较大。

2、获取内容

ob_get_clean

之前有输出或者中断。

其中,不发有可能第二种,其实基本是第一种问题居多

 解决办法:

百度也好,自己费力查询也罢,无外乎两种办法:

1、缓冲内容前面clear一下,再开始。

// 重点----start
ob_clean();
// 重点----end
ob_start();
// 输出图像
imagepng($this->im);
$content = ob_get_clean();
imagedestroy($this->im);

return response($content, 200, ['Content-Length' => strlen($content)])->contentType('image/png');

2、看看是否前面输出内容是BOM头,如果是的话就去改为UTF-8无BOM头格式。

解决步骤:

重点写下第二种解决办法吧。

1、取出头部缓冲区内容:

$content = ob_get_clean();
var_dump(empty($content), $content);die;
ob_start();
// 输出图像
imagepng($this->im);
$content = ob_get_clean();
imagedestroy($this->im);

return response($content, 200, ['Content-Length' => strlen($content)])->contentType('image/png');

输出内容:

bool(false) string(3) ""

空字符,是否empty为否,还有3个字符长度,看起来像是字符无法展示,而展示的空,,,技术受限,如果转为Ascii码的话估计能判断出是啥字符

 2、修改下输出为Ascii码

$content = ob_get_clean();
var_dump(empty($content), $content, ord($content));die;
ob_start();
// 输出图像
imagepng($this->im);
$content = ob_get_clean();
imagedestroy($this->im);

return response($content, 200, ['Content-Length' => strlen($content)])->contentType('image/png');
bool(false) string(3) "" int(239)

经过百度一些博客得知[那三个特殊字符的ascii码239,187,191就是BOM头的 EF BB BF]确实有个239是BOM头的Ascii码,文章地址:https://taotaoit.com/article/details/567.html

既然如此,我们可以找到我们当前项目内哪个文件没有删除BOM头,找个批量查找工具查找,用notepadd++改为无BOM头即可

我用的,会附上百度地址:

链接:https://pan.baidu.com/s/1SPAVLASRmp42AYZiday3lA  密码:47ah

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值