PHP 判断上传文件类型的问题

UniverseOS 2013-03-09 01:35:18
这几天都在写关于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;
}

这个函数可以判断真实的文件类型,但是我调用函数的时候,使用:
$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文件也一样),请问怎么写才正确?
...全文
835 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
UniverseOS 2013-03-09
  • 打赏
  • 举报
回复
自己把问题解决了: 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进制。
UniverseOS 2013-03-09
  • 打赏
  • 举报
回复
引用 1 楼 chen_bruce 的回复:
先打印出checkTitle方法的返回值是什么。 checkTitle方法里面怎么还有个$filename=($_FILES['file']['tmp_name']);
如果我写$filename=($_FILES['file']['name']);会报错,只好把name改成tmp_name
UniverseOS 2013-03-09
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
1、 function checkTitle($filename) //判断文件类型 { $filename=($_FILES['file']['tmp_name']); 应写作 PHP code?123function checkTitle($filename) //判断文件类型{ $filename = $filename['tmp_n……
我的表单里面上传文件就叫“file”: <input type="file" name="file" id="file">
xuzuning 2013-03-09
  • 打赏
  • 举报
回复
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,如果是别的名字呢?
chen_bruce 2013-03-09
  • 打赏
  • 举报
回复
先打印出checkTitle方法的返回值是什么。 checkTitle方法里面怎么还有个$filename=($_FILES['file']['tmp_name']);

21,893

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧