这几天都在写关于PHP文件上传的代码,BUG不断,都自己解决了,现在唯一没有解决的问题就是:
判断上传文件的类型。网上说的方法大多数是判断文件的扩展名或者类型($_FILES['file']['type']),但是如果有人把扩展名改掉,一样可以上传。所以我不使用这种方法。
后来发现一个函数:
function checkTitle($filename) //判断文件类型{ $filename=($_FILES['file']['tmp_name']); $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 8075: $fileType = 'zip'; break; case 8297: $fileType = 'rar'; 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' && $strInfo['chars2']=='-40' ){ return 'jpg'; } if ($strInfo['chars1']=='-119' && $strInfo['chars2']=='80' ) { return 'png'; } return $fileType;}
先打印出checkTitle方法的返回值是什么。
checkTitle方法里面怎么还有个 $filename=($_FILES['file']['tmp_name']);
1、
function checkTitle($filename) //判断文件类型
{
$filename=($_FILES['file']['tmp_name']);
应写作
function checkTitle($filename) //判断文件类型{ $filename = $filename['tmp_name']);
if(!in_array(checkTitle($_FILES['file']),$type)) //判断上传文件类型{
1、
function checkTitle($filename) //判断文件类型
{
$filename=($_FILES['file']['tmp_name']);
应写作
PHP code?123function checkTitle($filename) //判断文件类型{ $filename = $filename['tmp_n……
我的表单里面上传文件就叫“file”:
先打印出checkTitle方法的返回值是什么。
checkTitle方法里面怎么还有个$filename=($_FILES['file']['tmp_name']);
如果我写$filename=($_FILES['file']['name']);会报错,只好把name改成tmp_name
自己把问题解决了:
1.因为这时还没有移动临时文件,所以只能用tmp_name,如果用name当然无法得出结果(tmp_name的文件在服务器,而name的文件在客户端);
2.判断不出来的原因是因为array()里面的值都有“.”,删除掉就可以了:
$type=array('txt','rtf','doc','docx','xls','xlsx','ppt','.pptx','jpg','jpeg','png','bmp','png','zip','rar','7z','tar','gz','tar.gz');
(因为我开始使用的是按扩展名判断的方法,所以都有“.”)
现在文件上传的代码完全正常了,另外我在网上看到另一个代码,取文件头前4位,然后转换成16进制。