在php判断上传文件类型的各种方法中,读文件头是最常见的方法,但是读文件头是不能真实判断文件类型的。
判断文件类型,并不容易,本文为大家介绍一个php通过读文件头判断文件类型的代码,仅供参考。
除了office文件之外,对于其它文件类型的判断还是很准的。
代码如下:
/**
* 判断上传文件类型
* Edit www.
*/
function file_type($filename)
{
$file = fopen($filename, "rb");
$bin = fread($file, 2); //只读2字节
fclose($file);
$strInfo = @unpack("C2chars", $bin);
$typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
$fileType = '';
switch ($typeCode)
{
case 7790:
$fileType = 'exe';
break;
case 7784:
$fileType = 'midi';
break;
case 8297:
$fileType = 'rar';
break;
case 8075:
$fileType = 'zip';
break;
case 255216:
$fileType = 'jpg';
break;
case 7173:
$fileType = 'gif';
break;
case 6677:
$fileType = 'bmp';
break;
case 13780:
$fileType = 'png';
break;
default:
$fileType = 'unknown: '.$typeCode;
}
//Fix
if ($strInfo['chars1']=='-1' AND $strInfo['chars2']=='-40' ) return 'jpg';
if ($strInfo['chars1']=='-119' AND $strInfo['chars2']=='80' ) return 'png';
return $fileType;
}
//调用
echo file_type('start.php'); // 6063 or 6033
?>
不知道反过来定义 6063或者6033 就是指php的话 是不是不够严谨啊。
上面的代码,对于构造假的图片的文件类型判断,不是很好使。
此时可以考虑使用getimagesize来判断,参考代码如下:
/**
* getimagesize判断文件类型
* Edit www.
*/
if(in_array($attach['ext'], array('jpg', 'jpeg', 'gif', 'png', 'swf', 'bmp')) && function_exists('getimagesize') && !@getimagesize($target))
{
unlink($target);
upload_error('post_attachment_ext_notallowed', $attacharray);
}
?>
一、创建普通函数
1)、变量函数:
$func = 'test';
function test(){
echo 'yes !';
}
$func();
?>
2)、随机函数:
$newfunc = create_function('$a,$b', 'return $a.$b;');
echo "New anonymous function: $newfunc<br>";
echo $newfunc('just', 'coding');
?>
create_function — Create an anonymous (lambda-style) function
创建一个匿名函数。这个函数主要作用在unsort和array_walk的回调函数
$a,$b为参数,'return $a,$b' 为函数的代码
3)、回调函数 :
//5.3 以前
$array = array( 'asbc', 'ddd', 'tttt', 'qqq');
array_walk($array,create_function('&$item','$item=strtoupper()($item);') ); //function(&$itm){$itm = strtoupper($itm);}
print_r($array);
//5.3 以后
$array = array( 'asbc', 'ddd', 'tttt', 'qqq');
array_walk($array,function(&$itm){$itm = strtoupper($itm);});
print_r($array);
?>
array_walk(array,function,userdata...)
array_walk() 函数对数组中的每个元素应用回调函数。如果成功则返回 TRUE,否则返回 FALSE。
典型情况下 function 接受两个参数。array 参数的值作为第一个,键名作为第二个。如果提供了可选参数 userdata ,将被作为第三个参数传递给回调函数。
二、动态创建类函数
<?php
/* create class */
class Record {
/* record information will be held in here */
private $info;
/* constructor */
function Record($record_array) {
$record_array['body'] = 'this is a new attribution';
$this->info = $record_array;
}
/* dynamic function server */
function __call($method,$arguments) {
$meth = $this->from_case(substr($method,3,strlen($method)-3));
return array_key_exists($meth,$this->info) ? $this->info[$meth] : false;
}
function from_case($str) {
$str[0] = strtolower()($str[0]);
$func = create_function('$c', 'return "_" . strtolower($c[1]);'); // function ($c) { return "_" . strtolower($c[1]); }
return preg_replace_callback('/([A-Z])/', $func, $str);
}
} //by http://www.
/* usage */
$Record = new Record(
array(
'id' => 12,
'title' => 'Greatest Hits',
'description' => 'The greatest hits from the best band in the world!'
)
);
/* proof it works! */
echo 'The ID is: '.$Record->getId().'<br>'; // returns 12
echo 'The Title is: '.$Record->getTitle().'<br>'; // returns "Greatest Hits"
echo 'The Description is: '.$Record->getDescription().'<br>'; //returns "The greatest hits from the best band in the world!"
echo 'The Body is: '.$Record->getBody(); //returns "The greatest hits from the best band in the world!"
?>
如果你仔细观察以上的代码,会发现重点在于:__call 和 create_function 。
代码如下:
<?php /** * php目录遍历与删除操作 * Edit www. */ header("Content-type:text/html;charset=utf-8"); /** * 读取当前目录下的文件和目录 * * @param string $path 路径 * @return array 所有满足条件的文件 */ function tlist($path){ $path = iconv('utf-8', 'gbk', $path); if(!is_dir($path)){ throw new Exception($path."不是目录"); } $arr = array('dir'=>array(),'file'=>array()); $hd = opendir($path); while(($file = readdir($hd))!==false){ if($file=="."||$file=="..") {continue;} if(is_dir($path."/".$file)){ $arr['dir'][] = iconv('gbk','utf-8',$file); }else if(is_file($path."/".$file)){ $arr['file'][] = iconv('gbk','utf-8',$file); } } closedir($hd); echo "目录有:".implode("<br />",$arr['dir'])."<br />"; echo "文件有:".implode("<br />",$arr['file']); } /** * 遍历当前目录下的文件和目录以及子文件夹中目录 * * @param string $path 路径 * @return array 所有满足条件的文件 */ function blist($path){ if(!is_dir(iconv("utf-8","gbk",$path))){ throw new Exception("文件夹".$path."不存在或者不是文件"); } $arr = array(); $hd = opendir(iconv("utf-8","gbk",$path)); while(($file = readdir($hd))!==false){ if($file=="."||$file=="..") {continue;} $newpath=iconv('utf-8', 'gbk', $path) .'/'.$file; if(is_dir($newpath)){ $arr[] = blist($path."/".$file); }else if(is_file($newpath)){ $arr[] = iconv('gbk','utf-8',$file); } } closedir($hd); return $arr; } /** * 删除目录下的文件以及子目录 * #param string $path 路径 * #return string 删除成功返回true 失败返回false; */ function dirDel($path){ if(!is_dir($path)){ throw new Exception($path."输入的不是有效目录"); } $hand = opendir($path); while(($file = readdir($hand))!==false){ if($file=="."||$file=="..") continue; if(is_dir($path."/".$file)){ dirDel($path."/".$file); }else{ @unlink($path."/".$file); } } closedir($hand); @rmdir($path); } ?>