2017年3月

[linux][ubuntu] php 5.9 gd2 库回显 png 验证码显示失败

<p> 环境: Linux - Ubuntu, Nginx + php(5.5.9)</p><p> 问题: 使用 gd2 库, 当使用 imgcreate 创建图片验证码时显示失败, 在 Windows 下测试代码却没有问题. </p><p> 浏览器中验证码显示错误 </p><p> 通过上图发现服务器已经成功返回了数据但是浏览器显示失败.</p><p> 查阅相关说明, 回显的图片文件头不能含有任何额外数据.</p><p> 经过多番验证. 原因是负责创建验证码的文件是在 Windows 下创建的. 包含了 BOM 信息.</p><p> 只要把 BOM 即可. 以前就被 BOM 坑过.. 开发时候一般编辑器都能选择去 BOM 保存.</p><p> 下附一则 PHP 去 BOM 代码, 放到网页根目录访问即可.</p><p>
</p><pre class="brush:php; toolbar:false;"><?phpif (isset($_GET['dir'])) { //设置文件目录 $basedir = $_GET['dir'];} else { $basedir = '.';}$auto = 1;checkdir($basedir);function checkdir($basedir) { if ($dh = opendir($basedir)) { while (($file = readdir($dh)) !== false) { if ($file != '.' && $file != '..') { if (!is_dir($basedir . "/" . $file)) { echo "filename: $basedir/$file " . checkBOM("$basedir/$file") . " &lt;br&gt;"; } else { $dirname = $basedir . "/" . $file; checkdir($dirname); } } } closedir($dh); }}function checkBOM($filename) { global $auto; $contents = file_get_contents($filename); $charset[1] = substr($contents, 0, 1); $charset[2] = substr($contents, 1, 1); $charset[3] = substr($contents, 2, 1); if (ord($charset[1]) == 239 &amp;&amp; ord($charset[2]) == 187 && ord($charset[3]) == 191) { if ($auto == 1) { $rest = substr($contents, 3); rewrite($filename, $rest); return ("<font color='red'>BOM found, automatically removed.</font>"); } else { return ("<font color='red'>BOM found.</font>"); } } else return ("BOM Not Found.");}function rewrite($filename, $data) { $filenum = fopen($filename, "w"); flock($filenum, LOCK_EX); fwrite($filenum, $data); fclose($filenum);}?></pre><p>
</p>