php如何判断上传文件类型,PHP 判断上传文件类型的问题

这几天都在写关于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;}//Fixif ($strInfo['chars1']=='-1' && $strInfo['chars2']=='-40' ){return 'jpg';} if ($strInfo['chars1']=='-119' && $strInfo['chars2']=='80' ) {return 'png';}return $fileType;}

这个函数可以判断真实的文件类型,但是我调用函数的时候,使用:

$type=array('.txt','.rtf','.doc','.docx','.xls','.xlsx','.ppt','.pptx','.jpg','.jpeg','.png','.bmp','.png','.zip','.rar','.7z','.tar','.gz','.tar.gz');

if(!in_array(checkTitle ($_FILES['file']['tmp_name']) ,$type)) //判断上传文件类型

{

//文件类型不正确的提示

}

其中标红的部分,如果是$_FILES['file']['name']就报错,而如果是$_FILES['file']['tmp_name']就会提示文件类型不正确(即使我上传图片和rar文件也一样),请问怎么写才正确?

回复讨论(解决方案)

先打印出checkTitle方法的返回值是什么。

checkTitle方法里面怎么还有个 $filename=($_FILES['file']['tmp_name']);

1、

function checkTitle($filename) //判断文件类型

{

$filename=($_FILES['file']['tmp_name']);

应写作function checkTitle($filename) //判断文件类型{ $filename = $filename['tmp_name']);

2、

if(!in_array(checkTitle($_FILES['file']['tmp_name']),$type)) //判断上传文件类型

{

应写作

if(!in_array(checkTitle($_FILES['file']),$type)) //判断上传文件类型{

因为你不能假定表单控件都只命名为 file,如果是别的名字呢?

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进制。

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值