python - 解压后计算 zip 文件的 S3 ETag
问题描述
我在 S3 中有一个zip
文件,其中一个文件说它something.zip
包含一个文件夹,说文件夹something
里面有一些内容。我正在使用boto3
并python3.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 没有太多经验。
解决方案
推荐阅读
- c - 在c中创建char的动态矩阵
- python - 使用 3 列的 Python 熊猫组
- java - java.lang.ClassCastException:android.os.Parcelable[] 无法转换为 Photo[]
- javascript - 如何全选并在表格中取消?
- css - 在移动设备上,ReactJS 背景视频(样式化的组件)会跳转到全屏,您必须将其滑开才能将其移除。你如何解决这个问题?
- html - 如何使用 VBA 从表中的列表中单击下拉元素
- flutter - 使用 ColorFiltered 小部件将类似反转的颜色过滤器应用于子级
- ios - Apns 向 curl 请求返回 200,但未发送推送通知
- powerbi - 使用时间戳表根据类似状态过去 N 天
- python - ipykernel 与 Python 3.10 兼容吗?