如何检查本地文件是否与存储在S3中的文件相同而不下载?要避免一次又一次地下载大文件。 S3对象有电子标签,但如果文件是按部件上传的,并且这个question的解决方案似乎无法正常工作,则很难计算出来。有没有更简单的方法来避免不必要的下载
答案 0 :(得分:4)
如果它们不同,我会比较上次修改时间和下载。此外,您还可以在下载之前比较尺寸。给定bucket
,key
和本地文件fname
:
import boto3
import os.path
def isModified(bucket, key, fname):
s3 = boto3.resource('s3')
obj = s3.Object(bucket, key)
return int(obj.last_modified.strftime('%s')) != int(os.path.getmtime(fname))
答案 1 :(得分:2)
您可以使用小型本地数据库,例如文本文件?
下次,在继续下载之前,在“数据库”中查找ETag。如果存在,请计算现有文件的签名,并与ETag对应的签名进行比较。如果匹配,则远程文件与您拥有的文件相同。
有可能会使用不同的分块重新上传相同的文件,从而更改ETag。除非这很可能,否则你可以忽略假阴性并在极少数情况下重新下载文件。
答案 2 :(得分:0)
如果您不需要立即清点,则可以生成s3 storage inventory,然后将其导入数据库以备将来使用。
如图所示here for normal file and huge multipart file计算本地文件Etag。