在linux环境下开发的网站,要移植到windows环境下布署,验证码图片在windows下始终显示不出来,linux下显示是正常的,查其原因,应该是加载的文件里头部带了bom信息,导致显示不出来,于是想到了写个批量替换文件头部bom信息。分享给大家~
什么是文件头部Bom? 不知道的童鞋自补一下:查看文章
说白了,就是在保存文件的时候,文件前面会多出一串隐藏的字符,但网站文件那么多,我们手工来重新编辑太麻烦,用下面的程序来批量去除文件头部Bom:
文件名:bom.class.php<?php <br />
/**<br>
* 批量去除文件头bom.<br>
* Author: Simon<br>
* E-mail: vsiryxm@qq.com<br>
* Date: 2015-8-5<br>
*/<br>
<br>
class Bom {<br>
static public $total = 0; //文件数统计<br>
static public $count = 0; //替换数统计<br>
<br>
protected $config = array(<br>
'auto' => 1, // 是否自动替换 1为自动替换<br>
'dir' => '.', // 遍历的目录 默认当前<br>
'r' => 1, // 1为递归<br>
);<br>
<br>
function __construct(){<br>
if(isset($_REQUEST['auto'])){<br>
$this->config['auto'] = $_REQUEST['auto'];<br>
}<br>
if(!empty($_REQUEST['dir'])){<br>
$this->config['dir'] = $_REQUEST['dir'];<br>
}<br>
if(isset($_REQUEST['r'])){<br>
$this->config['r'] = $_REQUEST['r'];<br>
}<br>
}<br>
<br>
// 设置<br>
public function set($key,$value=''){<br>
if(isset($this->config[$key])){<br>
$this->config[$key] = $value;<br>
}<br>
}<br>
<br>
// 遍历目录下的文件并替换bom<br>
public function remove($curr_dir=''){<br>
$dir = !empty($curr_dir)?$curr_dir:$this->config['dir'];<br>
if($files = opendir($dir)) {<br>
ob_end_flush(); // 直接输出缓冲区内容<br>
while(($file = readdir($files)) !== false) {<br>
if($file != '.' && $file != '..'){<br>
// 是目录 递归<br>
if(is_dir($dir.DIRECTORY_SEPARATOR.$file) && $this->config['r']==1){<br>
$this->remove($dir.DIRECTORY_SEPARATOR.$file);<br>
}<br>
elseif(!is_dir($dir.DIRECTORY_SEPARATOR.$file)){<br>
self::$total++;<br>
if($content = $this->checkBOM($dir.DIRECTORY_SEPARATOR.$file)){<br>
if ($this->config['auto']==1){<br>
$content = substr($content, 3);<br>
$this->rewrite($dir.DIRECTORY_SEPARATOR.$file,$content);<br>
echo '<span>'.$dir.DIRECTORY_SEPARATOR.$file.' 已经替换!</span><br>'.PHP_EOL;<br>
self::$count++;<br>
}<br>
else{<br>
echo '<span>'.$dir.DIRECTORY_SEPARATOR.$file.' 存在Bom!</span><br>'.PHP_EOL;<br>
}<br>
}<br>
else{<br>
echo $dir.DIRECTORY_SEPARATOR.$file.' 没有Bom!<br>'.PHP_EOL;<br>
}<br>
}<br>
}<br>
flush();<br>
//sleep(1);<br>
}<br>
closedir($files);<br>
}<br>
else{<br>
echo '检查路径不存在!';<br>
}<br>
}<br>
<br>
// 检查Bom<br>
public function checkBOM($filename){<br>
$content = file_get_contents($filename);<br>
if(!empty($content)){<br>
$charset[1] = substr($content, 0, 1);<br>
$charset[2] = substr($content, 1, 1);<br>
$charset[3] = substr($content, 2, 1);<br>
if (ord($charset[1])==239 && ord($charset[2])==187 && ord($charset[3])==191){<br>
return $content;<br>
}<br>
}<br>
return false;<br>
}<br>
<br>
// 重写文件<br>
public function rewrite($filename, $data){<br>
$file = fopen($filename, "w");<br>
flock($file, LOCK_EX);<br>
fwrite($file, $data);<br>
fclose($file);<br>
}<br>
<br>
}<br>
<br>
////////////////////////////////////////////////<br>
//调用<br>
$bom = new Bom();<br>
<br>
echo
nbsp;html><br>
<br>
<br>
<meta>
<br>
<meta>
<br>
<title></title>
<br>
<meta>
<br>
<style><br />
body,h1,div{margin:0;padding:0;font:14px/1.5 'Microsoft Yahei',tahoma,arial;}<br />
.process {width:800px;height:750px;padding:20px;border:1px solid #ddd;overflow:scroll;margin-left:20px;line-height:180%;}<br />
h1{font-size:25px;text-indent:20px;margin:20px 0 10px 0;}<br />
</style>
<br>
<br>
<br>
<h1>开始检查Bom...</h1>
<br>
<div>
<br>
EOF;<br>
<br>
$bom->remove(); <br>
<br>
echo '<script>document.getElementById(\'result\').innerHTML = \'检测完毕!共有'.Bom::$total.'个文件,替换了'.Bom::$count.'个文件\';</script>';<br>
echo
</div>
<br>
<br>
<br>
EOF;<br>
$bom = null;<br>
?>
从上面的类可以看出,我们在调用时,使用默认参数(当前目录、可以递归、自动移除)来运行程序,也可以设置参数来运行:
调用方法二://调用<br>
$bom = new Bom();<br>
$bom->set('auto',0); //不自动替换,只检查<br>
$bom->set('dir','./test'); //当前目录下的test目录<br>
$bom->set('r',0); //不递归查找子目录
调用方法三:
http://你的域名/bom.php?auto=1&dir=./test/&r=1
运行效果:
附批量去除文件头部Bom信息文件包>>>
上传到网站任意目录下,在浏览器里访问运行即可。在运行前请先备份好站点文件,保证要替换的文件可写入。
点击下载:
bom.class.zip ( 1.78 KB 下载:30 次 )
AD:真正免费,域名+虚机+企业邮箱=0元