在PHP 中, md5_file()是一個非常方便的函數,用於計算一個文件的MD5 散列值。它的使用非常簡單:
<code> $hash = md5_file('path/to/file.txt'); </code>這在文件完整性驗證、緩存標識生成等場景中非常實用。然而,在Node.js 中並沒有與md5_file()完全等效的內置函數。不過,我們可以藉助Node.js 的核心模塊crypto以及fs模塊,手動實現類似的功能。
Node.js 中的crypto模塊提供了強大的加密能力,而fs模塊則允許我們以流的方式讀取文件內容。結合這兩者,我們可以讀取文件內容並實時計算其MD5 值。
以下是實現代碼:
<code> const fs = require('fs'); const crypto = require('crypto'); function md5File(filePath) {
return new Promise((resolve, reject) => {
const hash = crypto.createHash('md5');
const stream = fs.createReadStream(filePath);
stream.on('data', chunk => hash.update(chunk));
stream.on('end', () => resolve(hash.digest('hex')));
stream.on('error', reject);
});
}
// 使用示例
md5File('example.txt')
.then(hash => {
console.log('MD5:', hash);
})
.catch(err => {
console.error('讀取文件出錯:', err);
});
</code>
這個函數返回一個Promise,當文件被成功讀取並完成哈希處理時,返回對應的MD5 值。
假設你構建了一個上傳服務,需要驗證用戶上傳的文件是否在上傳前後保持一致,可以將上傳前的MD5 值與服務器上生成的值進行比對:
<code> app.post('/upload', (req, res) => { const uploadedFilePath = '/tmp/uploaded.file'; // 假設你已經將文件保存到uploadedFilePath
md5File(uploadedFilePath).then(serverHash => {
const clientHash = req.body.md5;
if (serverHash === clientHash) {
res.send('文件一致');
} else {
res.status(400).send('文件校驗失敗');
}
}).catch(() => {
res.status(500).send('內部錯誤');
});
});
</code>
要實現完整的功能,你可能還需要在客戶端上傳之前先生成文件的MD5 值。在瀏覽器端可以使用SparkMD5這樣的庫配合FileReader API 來計算文件哈希值。
儘管Node.js 沒有PHP 中md5_file()的快捷函數,但通過crypto和fs模塊我們可以很容易地實現類似的功能。通過使用流式處理方式,我們還能確保對大型文件處理時的內存效率,適合構建高性能的文件校驗與處理服務。