在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 開發者都應該掌握的基本技能之一。