我在S3中有一个文件,其中有一个zip
文件,比如something.zip
,它包含一个文件夹,比如something
,文件夹中有一些内容。我正在使用boto3
来python3.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没有太多经验
目前没有回答
相关问题 更多 >
编程相关推荐