首页 > 解决方案 > 解压后计算 zip 文件的 S3 ETag

问题描述

我在 S3 中有一个zip文件,其中一个文件说它something.zip包含一个文件夹,说文件夹something里面有一些内容。我正在使用boto3python3.6下载它,然后解压缩并根据我的需要使用它。在稍后的某个时间点,当我需要使用文件something夹中的文件时,我需要验证它确实没有以任何方式被篡改。我不想再次下载整个文件然后解压缩。所以我想再次压缩something文件夹something.zip,然后计算 S3 ETag。我正在使用下面的这个函数来验证上传,方法是在上传之前计算 ETag,然后检查list_objects函数提供的 ETag boto_client,它运行良好,我能够验证上传。

def calculate_s3_etag(folder_path, chunk_size=8 * 1024 * 1024):
    md5s = []
    with open(folder_path, 'rb') as fp:
        while True:
            data = fp.read(chunk_size)
            if not data:
                break
            md5s.append(hashlib.md5(data))

    if len(md5s) == 1:
        return '"{}"'.format(md5s[0].hexdigest())

    digests = b''.join(m.digest() for m in md5s)
    digests_md5 = hashlib.md5(digests)
    return '"{}-{}"'.format(digests_md5.hexdigest(), len(md5s))

但是,当我对通过将文件something夹压缩到创建的压缩文件执行相同操作时something.zip,它不起作用并且我无法验证文件夹。我做错了吗?我提到了一些讨论线程来检查,但无法在任何地方找到这个特定的用例。据我所知,如果我在原始下载文件本身上计算 ETag,它会起作用的,对吧?

有没有办法做到这一点?或者是否有更好的方法来实现我的目标?当我从 S3 下载它时,我只需要检查该文件夹的内容是否确实处于相同的状态。

注意:我的文件大小在 10MB 到 800MB 左右,所以我认为 5GB 的问题不会影响我,但我对 S3 没有太多经验。

标签: pythonpython-3.xamazon-s3boto3aws-cli

解决方案


推荐阅读