PHP获取文件信息与MIME类型的实用方法
在PHP开发中,经常需要获取文件的详细属性或判断其真实类型。本文将介绍如何使用fstat获取文件统计信息,以及如何利用fileinfo、mime_content_type(废弃)及图像扩展函数来准确识别文件的MIME类型,并附带基于文件头魔数的检测实现。
获取文件基本统计信息
要获取文件的大小、最后访问时间(atime)和最后修改时间(mtime),最稳健的方式是打开文件句柄后使用fstat()函数。这种方法比直接调用filesize()或filemtime()更通用,因为它不依赖于文件系统缓存的一致性,且能直接通过句柄操作。
<?php
$file = "php.txt";
// 以只读方式打开文件
$handle = fopen($file, "r");
// 获取文件状态数组
$fstat = fstat($handle);
// 输出文件名
basename($file);
// 输出文件大小(转换为KB,保留两位小数)
echo round($fstat["size"] / 1024, 2) . " KB\n";
// 输出最后访问时间
echo date("Y-m-d H:i:s", $fstat["atime"]) . "\n";
// 输出最后修改时间
echo date("Y-m-d H:i:s", $fstat["mtime"]);
fclose($handle);
?
判断文件MIME类型
MIME(Multipurpose Internet Mail Extensions)类型用于指定文件的媒体类型,浏览器借此决定如何渲染或下载文件。PHP提供了以下几种主要方式来获取MIME类型:
推荐:使用 Fileinfo 扩展 (PHP 5.3+)
fileinfo 是PHP官方推荐的现代标准方法,无需额外配置即可使用(大多数环境默认启用)。它能通过读取文件内容的“魔法数字”(Magic Bytes)而非仅依赖扩展名来准确判断类型。
$filename = 'example.jpg';
// 创建Finfo对象,指定返回MIME类型
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($finfo, $filename);
finfo_close($finfo);
echo $mimeType; // 例如: image/jpeg
备选:通过 $_FILES 全局变量获取
在处理文件上传时,可以直接从$_FILES数组中读取客户端提交的MIME类型:$_FILES['uploadfile']['type']。
注意:此值由浏览器提供,不可完全信任,容易伪造。在生产环境中,务必结合fileinfo或mime_content_type进行服务端二次校验。
历史方法:mime_content_type ()
mime_content_type()函数在旧版本PHP中常用,但自PHP 5.3.0起已被废弃,并在后续版本中移除。若仍在使用旧版环境,需确保启用了magic_mime扩展,但强烈建议迁移至fileinfo。
特定场景:图像文件MIME判断
如果仅需处理图像,可利用图像处理扩展。exif_imagetype()可快速识别图像格式并返回常量,配合image_type_to_mime_type()转换:
// 需要在php.ini中启用 extension=php_exif.dll 和 php_mbstring.dll
$imageType = exif_imagetype('photo.jpg');
if ($imageType !== false) {
$mime = image_type_to_mime_type($imageType);
echo $mime;
}
高级技巧:基于文件头魔数判断类型
在某些极端情况下(如无扩展名文件),可通过读取文件开头的字节(Header/Magic Number)来判断类型。以下代码演示了如何通过读取前两个字节来识别EXE、MIDI、RAR、JPG、GIF、BMP和PNG文件:
<?php
function getMagicFileType($filename) {
$file = fopen($filename, "rb");
if (!$file) return 'unknown';
$bin = fread($file, 2); // 读取前2个字节
fclose($file);
// 将字节转换为十进制整数组合
$strInfo = @unpack("c2chars", $bin);
$typeCode = intval($strInfo['chars1'] . $strInfo['chars2']);
switch ($typeCode) {
case 7790: return 'exe'; // MZ (Windows Executable)
case 7784: return 'midi'; // MM
case 8297: return 'rar'; // Rar!
case 255216: return 'jpg'; // \xFF\xD8
case 7173: return 'gif'; // G I
case 6677: return 'bmp'; // B M
case 13780: return 'png'; // \x89 P N
default: return 'unknown';
}
}
echo getMagicFileType('test.mid'); // 输出: midi
?
以上就是获取文件信息和判断文件类型的详细内容,更多关于PHP文件处理的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













