在实际开发中,文件指纹(文件哈希值)是一种常见的需求,用于验证文件完整性、防止篡改,或者实现文件去重等功能。PHP 提供了强大的内置函数 md5_file(),可以方便地获取文件的 MD5 哈希值。结合 scandir() 函数,可以轻松实现对指定目录下所有文件的批量指纹生成。
本文将详细介绍如何使用 md5_file() 和 scandir() 来实现批量生成文件指纹,并给出完整的示例代码。
md5_file(string $filename): string|false
计算指定文件的 MD5 散列值,返回 32 位的字符串,如果读取失败则返回 false。
scandir(string $directory, int $sorting_order = SCANDIR_SORT_ASCENDING): array|false
获取指定目录下的所有文件和子目录,返回包含文件名的数组。
利用 scandir() 获取目标目录下的所有文件和文件夹名称。
过滤掉目录项中的特殊目录 . 和 ..。
遍历所有文件,使用 md5_file() 获取其 MD5 指纹。
将文件名与对应的 MD5 值存储到数组或输出。
<?php
$directory = '/path/to/your/files'; // 这里替换为你想要扫描的目录路径
// 扫描目录
$files = scandir($directory);
if ($files === false) {
die('目录读取失败');
}
$fileHashes = [];
foreach ($files as $file) {
// 过滤掉 '.' 和 '..'
if ($file === '.' || $file === '..') {
continue;
}
$filePath = $directory . DIRECTORY_SEPARATOR . $file;
// 只处理文件,忽略子目录
if (is_file($filePath)) {
$hash = md5_file($filePath);
if ($hash !== false) {
$fileHashes[$file] = $hash;
} else {
$fileHashes[$file] = '读取失败';
}
}
}
// 输出结果
foreach ($fileHashes as $filename => $md5) {
echo "文件名:{$filename},MD5 指纹:{$md5}" . PHP_EOL;
}
?>
目录路径需要写成服务器上的实际路径,确保 PHP 脚本有权限读取该目录。
该示例代码仅处理指定目录的第一层文件,不会递归子目录。如果需要递归,可配合递归函数或 RecursiveDirectoryIterator 实现。
md5_file() 适合小文件快速生成指纹,大文件建议采用分块计算哈希值,避免内存溢出。
有时,我们需要对远程文件生成指纹。虽然 md5_file() 支持远程文件 URL,但如果远程服务器限制访问,可能会失败。建议先下载文件到本地临时目录再计算。
示例(示意):