这是模板中的验证码:
<img id="imgVerify" style="cursor:pointer;" src="/index.php/Admin/Admin/vertify" onclick="fleshVerify();">
虽然图片无法显示,但F12查看响应头是200
我在入口插入一个echo语句时,验证码就无法显示。去掉这个echo时,就能正常显示。
换成tp5,在同样位置echo,就不影响验证码:
这是模板中的验证码:
<img id="imgVerify" style="cursor:pointer;" src="/index.php/Admin/Admin/vertify" onclick="fleshVerify();">
虽然图片无法显示,但F12查看响应头是200
我在入口插入一个echo语句时,验证码就无法显示。去掉这个echo时,就能正常显示。
换成tp5,在同样位置echo,就不影响验证码:
我简单说下吧。
当你返回图片时,是不能够加入echo等打印输出语句的。原因大概是这样:
无论是图片还是字符串,本质上都是二进制。每一种图片的类型都是有特定的文件头的,也就是说:当浏览器接收到thinkphp返回的二进制时,首先会比对这个文件头(二进制的前多少位),然后再根据这个文件头来确定图片是哪种格式的(png,jpg,jpeg)。
比如PNG图片的文件头:
而如果在返回这个文件头前有其它内容的话,其它的内容则会被认为是文件头,而明显的这个被你不小心追加了内容的文件头,并不能并识别为是:图片文件。
所以就不会被浏览器渲染成功了。
而至于为什么原回的状态码是200,这是由于ThinkPHP在执行你的echo,以及返回图片的内容时,并没有任何的异常。他以为你的客户端要就是 echo 的内容 + 文件的内容,当然最终的结果是200了。
而至于说在非文件输出时,为什么可以直接echo,这是因为你即使echo了相关的字符串,最终的字符串还是会被浏览器识别出来。所以你多一个少一个echo当然就都不会有问题了。
其实你这个问题与ThinkPHP3.2无关,主要还是在于对数据的理解上。在计算机的世界里,一切数据都是二进制。
1 回答981 阅读✓ 已解决
2 回答601 阅读✓ 已解决
1 回答468 阅读✓ 已解决
1 回答458 阅读✓ 已解决
2 回答493 阅读
1 回答375 阅读✓ 已解决
入口有:
ob_start('ob_gzhandler');
所以验证码类里面用:
ob_end_clean()
可以,但用ob_clean()
不可以。因为后面输出图片的是:
各种 header,还有imagepng
这些不能用gzip压缩格式