我正在寻找计算位于S3中的图像文件的sha256校验和,而不将其写入磁盘。
我试过下面的代码:
const data = (
await getS3().getObject({ Bucket: bucketName, Key: fileName }).promise()
).Body.toString('utf-8');
logger.info(`File data: ${data}`);
const sha256 = createHash('sha256');
sha256.update(data);
const hex = sha256.digest('hex');
logger.info(`SHA256 HEX: ${hex}`);
如果我使用基本的.txt文件,hex
的值与其他基于浏览器的工具(例如https://emn178.github.io/online-tools/sha256_checksum.html)匹配,但是当我使用图像文件(.png)时,我得到了不同的值。知道我哪里做错了吗?
我也试过使用
const data = (
await getS3().getObject({ Bucket: bucketName, Key: fileName }).promise()
).Body.toString('binary');
sha256还是不一样的
我想也许我需要使用S3.getObject(params). createreadstream(),但我不知道为什么这会有所不同。
我最终通过使用读流而不是承诺版本的getObject得到了解决方案:
return new Promise((resolve, reject) => {
const hash = createHash('sha256');
const stream = S3.getObject({ Bucket: bucketName, Key: fileName }).createReadStream();
stream.on('data', (d) => hash.update(d));
stream.on('end', () => {
const digest = hash.digest('hex');
logger.debug(`SHA256: [${digest}]`);
resolve(digest);
});
stream.on('error', reject);
});