PHP获取文件信息与MIME类型的实用方法

程一诺
程一诺
发布时间:2026-10-13| 6人浏览过
原创

在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文件处理的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。