thinkphp3.2 在入口插入 echo 语句时为什么验证码无法显示响应?

这是模板中的验证码:

<img id="imgVerify" style="cursor:pointer;" src="/index.php/Admin/Admin/vertify" onclick="fleshVerify();">

虽然图片无法显示,但F12查看响应头是200

我在入口插入一个echo语句时,验证码就无法显示。去掉这个echo时,就能正常显示。

换成tp5,在同样位置echo,就不影响验证码:

回复
阅读 1.1k
2 个回答

入口有:ob_start('ob_gzhandler');
所以验证码类里面用:ob_end_clean()可以,但用 ob_clean()不可以。
因为后面输出图片的是:各种 header,还有imagepng 这些不能用gzip压缩格式

我简单说下吧。

当你返回图片时,是不能够加入echo等打印输出语句的。原因大概是这样:

无论是图片还是字符串,本质上都是二进制。每一种图片的类型都是有特定的文件头的,也就是说:当浏览器接收到thinkphp返回的二进制时,首先会比对这个文件头(二进制的前多少位),然后再根据这个文件头来确定图片是哪种格式的(png,jpg,jpeg)。

比如PNG图片的文件头:
image.png

而如果在返回这个文件头前有其它内容的话,其它的内容则会被认为是文件头,而明显的这个被你不小心追加了内容的文件头,并不能并识别为是:图片文件。

所以就不会被浏览器渲染成功了。

而至于为什么原回的状态码是200,这是由于ThinkPHP在执行你的echo,以及返回图片的内容时,并没有任何的异常。他以为你的客户端要就是 echo 的内容 + 文件的内容,当然最终的结果是200了。

而至于说在非文件输出时,为什么可以直接echo,这是因为你即使echo了相关的字符串,最终的字符串还是会被浏览器识别出来。所以你多一个少一个echo当然就都不会有问题了。

其实你这个问题与ThinkPHP3.2无关,主要还是在于对数据的理解上。在计算机的世界里,一切数据都是二进制。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏