解压后计算zip文件的S3 ETag

2024-09-22 16:31:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我在S3中有一个文件,其中有一个zip文件,比如something.zip,它包含一个文件夹,比如something,文件夹中有一些内容。我正在使用boto3python3.6并下载它,然后解压缩它,并根据我的需要使用它。稍后,当我需要使用something文件夹中的文件时,我需要验证它确实没有被任何方式篡改。我不想再次下载整个文件,然后将其解压缩。因此,我想再次将something文件夹压缩到something.zip,然后计算s3etag。我在下面使用这个函数来验证上传,方法是在上传之前计算ETag,然后使用boto_client中的list_objects函数提供的ETag进行检查,它工作正常,我能够验证上传

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没有太多经验


Tags: 文件path方法函数文件夹内容datas3