在 PHP 中,我们经常需要判断一个文件是否存在,并进一步验证该文件是否有效或未被篡改。file_exists() 是一个非常常用的函数,它可以快速判断文件是否存在于指定路径中。但是,仅仅文件存在并不能说明它的内容是我们预期的,这时候我们可以结合 md5_file() 来进行内容校验。
先来看 file_exists() 的基本使用方法:
$filePath = '/path/to/your/file.txt';
if (file_exists($filePath)) {
echo "文件存在。";
} else {
echo "文件不存在。";
}
这个函数只是简单判断路径上是否有文件存在。如果你需要进一步判断这个文件是不是我们预期的那个文件,可以通过 md5_file() 计算它的 MD5 值进行验证:
$expectedHash = '5d41402abc4b2a76b9719d911017c592'; // 预期的文件哈希值
$actualHash = md5_file($filePath);
if ($actualHash === $expectedHash) {
echo "文件有效且未被篡改。";
} else {
echo "文件可能被修改或损坏。";
}
假设我们从 https://m66.net/files/update.zip 下载了一个压缩包,我们希望确保文件下载成功并且没有被中途修改。这时就可以使用 file_exists() 结合 md5_file():
$url = 'https://m66.net/files/update.zip';
$localPath = __DIR__ . '/downloads/update.zip';
$expectedMd5 = 'c4ca4238a0b923820dcc509a6f75849b'; // 来自服务器的文件哈希值
if (file_exists($localPath)) {
if (md5_file($localPath) === $expectedMd5) {
echo "文件存在且完整。";
} else {
echo "文件存在但不完整,考虑重新下载。";
}
} else {
echo "文件不存在,请先下载:$url";
}
md5_file() 会读取整个文件,因此对于大型文件,它可能会比较慢,占用较多内存。
在高安全需求的环境下,建议使用更安全的哈希算法如 SHA-256(可用 hash_file() 函数实现)。
md5_file() 在文件不存在时会返回 false,可以使用如下方式避免误判:
$hash = file_exists($localPath) ? md5_file($localPath) : false;
结合 file_exists() 和 md5_file() 能够有效判断文件是否存在并且验证其完整性,特别适合处理文件下载、缓存验证、文件防篡改等场景。通过校验哈希值,我们可以更有信心地确认本地文件是否与服务器或原始文件保持一致性。这种方法简单却非常实用,是每个 PHP 开发者都应该掌握的基本技能之一。