我在本地文件夹中有一些文件。这些文件可以在本地修改。我需要在S3上保存更新文件的副本。是否有一种方法可以检查本地文件是否等于S3上的文件(例如:使用校验和)?这样我就不用上传没有修改过的文件了。我正在使用boto3和Python。
Amazon S3对象有一个实体标签(ETag)表示该对象的特定版本。它是一个计算的校验和,您可以将其与本地对象上的等效计算的校验和进行比较。
参见:使用Content-MD5和ETag来验证上传的对象
我建议首先检查长度的文件,因为它是非常简单的,不同的长度表示文件是不一样的。然后,计算本地对象的ETag,并与S3对象上的ETag进行比较。 然而,ETag是而不是如果对象是加密的,则为MD5,并且bucket现在默认使用加密。因此,ETag方法可能不适用于您的特定存储桶——尝试一些实验来确认它是否适用。最坏的情况是,您总是可以在上传之前计算MD5,然后在上传期间将MD5作为元数据存储在对象上。您可以使用它在将来比较文件。S3甚至可以为您做这些。参见:Amazon S3新增校验和算法| AWS新闻博客
显然,boto3的s3客户机在没有实际下载文件的情况下不会返回校验和值。一种解决方法是使用最后修改的时间戳:您可以使用list_objects调用中返回的LastModified
信息,并将其与本地文件的最后修改时间进行比较。
由于您使用的是python,因此获取文件修改时间的一种方法是:
import os
os.path.getmtime(path)