php获得上传文件类型的几种技巧
发布时间:2022-07-18 14:24:57 所属栏目:PHP教程 来源:互联网
导读:1、mime_content_type()函数判断获取文件类型 mime_content_type返回指定文件的MIME类型, 用法: 1 echomime_content_type(php.gif) .n; echomime_content_type(test.php); 输出: image/gif 2、php Fileinfo 获取文件类型(finfo_open) PHP官方推荐mime_con
1、mime_content_type()函数判断获取文件类型 mime_content_type返回指定文件的MIME类型, 用法: 1 echomime_content_type('php.gif') ."n"; echomime_content_type('test.php'); 输出: image/gif 2、php Fileinfo 获取文件类型(finfo_open) PHP官方推荐mime_content_type()的替代函数是Fileinfo函数。PHP 5.3.0+已经默认支持Fileinfo函数(fileinfo support-enabled),不必进行任何配置即可使用finfo_open()判断获取文件MIME类型。 用法代码如下: $finfo = finfo_open(FILEINFO_MIME); $mimetype = finfo_file($finfo, $filename); finfo_close($finfo); 3、image_type_to_mime_type()获取图片类型 如果需要判断MIME类型的文件只有图像文件,那么首先可以使用exif_imagetype()函数获取图像类型常量,再用image_type_to_mime_type()函数将图像类型常量转换成图片文件的MIME类型。 注意: 需要在php.ini中配置打开php_mbstring.dll (Windows需要)和extension=php_exif.dll。 4、php获取上传文件类型 如果使用php上传文件,检测上传文件的MIME类型,则可以使用全局变量$_FILES['uploadfile']['type'],由客户端的浏览器检测获取文件MIME类型。 下面直接上代码,相信略有些php功底的朋友,读来都不成问题,我实现的是仅支持word和pdf文件,且文件大小小于512kb: $tmpname = $_FILES ['userfile'] ['tmp_name']; if(is_uploaded_file($tmpname)) { $mimetype = detectMIME($tmpname); $tuozhanming = getFileExt($filename, $mimetype); if($tuozhanming == "type_error"){ echo '仅支持word和pdf文件,且文件大小小于512kb:<a href='.$reurl.'>请重试</a>'; exit(); } }else{ $_FILES ['userfile'] ['error'] = 6; } if ($_FILES ['userfile'] ['error'] > 0) { echo 'Problem: '; switch ($_FILES ['userfile'] ['error']) { case 1 : echo '上传文件过大:<a href='.$reurl.'>请重试</a>'; break; case 2 : echo '上传文件过大:<a href='.$reurl.'>请重试</a>'; break; case 3 : echo '文件上传丢失:<a href='.$reurl.'>请重试</a>'; break; case 4 : echo '无文件被上传:<a href='.$reurl.'>请重试</a>'; break; case 6 : echo '仅支持word和pdf文件,且文件大小小于512kb:<a href='.$reurl.'>请重试</a>'; break; case 7 : echo '上传文件存储失败:<a href='.$reurl.'>请重试</a>'; break; //上传文件 $_FILES ['userfile'] ['name'] = time () . "." . $tuozhanming; $upfile = '../uploads/' . $_FILES ['userfile'] ['name']; if ( !move_uploaded_file ( $_FILES ['userfile'] ['tmp_name'], $upfile )) { echo 'Problem: 文件移动失败'; exit (); } } function detectMIME($filename) { $file = fopen ( $filename, "rb" ); $finfo = finfo_open ( FILEINFO_MIME ); if (! $finfo) { // 直接读取文件的前4个字节,根据硬编码判断 $file = fopen ( $filename, "rb" ); $bin = fread ( $file, 4 ); //只读文件头4字节 fclose ( $file ); $strInfo = @unpack ( "C4chars", $bin ); //dechex() 函数把十进制转换为十六进制。 $typeCode = dechex ( $strInfo ['chars1'] ) . dechex ( $strInfo ['chars2'] ) . dechex ( $strInfo ['chars3'] ) . dechex ( $strInfo ['chars4'] ); $type = ''; switch ($typeCode) //硬编码值查表 { case "504b34" : $type = 'application/zip; charset=binary'; break; case "d0cf11e0" : $type = 'application/vnd.ms-office; charset=binary'; break; case "25504446" : } else { //finfo_file return information of a file $type = finfo_file ( $finfo, $filename ); } return $type; function getFileExt($filename, $type) { switch ($type) { case "application/zip; charset=binary" : $extType = "docx"; break; case "application/vnd.ms-office; charset=binary" : $extType = "doc"; break; case "application/msword; charset=binary" : $extType = "doc"; break; case "application/pdf; charset=binary" : $extType = "pdf"; return $extType; } 方法五,网上流传一段PHP读取文件头判断文件类型的方法,有一些bug,经我(54chen)修改实测,应该是这个样子: /** * 读取文件前几个字节 判断文件类型 * * @return String */ function checkTitle($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) { (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |