仅当 S3 文件已更改时,如何下载它?
Posted
技术标签:
【中文标题】仅当 S3 文件已更改时,如何下载它?【英文标题】:How do I download an S3 file only if it has changed? 【发布时间】:2018-02-27 12:54:54 【问题描述】:我有一个 900 MB 的文件,如果尚未下载,我想从 S3 将其下载到磁盘。有没有一种简单的方法可以让我只下载尚未安装的文件?我知道 S3 支持查询文件的 MD5 校验和,但我希望不必自己构建这个逻辑。
【问题讨论】:
【参考方案1】:我已使用以下代码下载时间戳大于本地文件夹时间戳的 S3 文件。首先检查 S3 文件夹中的任何文件的时间戳是否大于本地文件夹时间戳。如果是,则仅下载这些文件。
TransferManager transferManager = TransferManagerBuilder.standard().build();
AmazonS3 amazonS3 = AmazonS3ClientBuilder.standard().build();
Path location = Paths.get("/data/test/");
FileTime lastModifiedTime = null;
try
lastModifiedTime = Files.getLastModifiedTime(location, LinkOption.NOFOLLOW_LINKS);
catch (IOException e)
e.printStackTrace();
Date lastUpdatedTime = new Date(lastModifiedTime.toMillis());
ObjectListing listing = amazonS3.listObjects("bucket", "test-folder");
List<S3ObjectSummary> summaries = listing.getObjectSummaries();
for (S3ObjectSummary os: summaries)
if(os.getLastModified().after(lastUpdatedTime))
try
String fileName="/data/test/"+os.getKey();
Download multipleFileDownload = transferManager.download(bucket, os.getKey(), new File(fileName));
while (multipleFileDownload.isDone() == false)
Thread.sleep(1000);
catch(InterruptedException i)
LOG.error("Exception Occurred while downloading the file ",i);
【讨论】:
【参考方案2】:您可以使用 AWS CLI 的 s3 sync
command。
同步目录和 S3 前缀。递归地复制新的和更新的文件从源目录到目标。
根据this forum thread,可以使用sync
只同步一个文件:
aws s3 sync s3://bucket/path/ local/path/ --exclude "*" --include "File.txt"
它说:同步给定的路径,排除所有文件,但包括"File.txt"
- 所以它只会在那些给定的路径下同步"File.txt"
。
或使用 Java SDK:
根据javadoc,getObjectMetadata
method 将返回有关 S3 对象(文件)的信息,而无需下载其内容。
该方法返回一个ObjectMetadata
对象,它可以为您提供一些有用的信息:
getLastModified
method:
获取 Last-Modified 标头的值,指示 Amazon S3 上次记录对关联对象的修改的日期和时间。
getContentMD5
method:
根据 RFC 1864 获取关联对象(内容 - 不包括标头)的 base64 编码的 128 位 MD5 摘要。
getETag
method:
根据 RFC 1864 获取关联对象的十六进制编码的 128 位 MD5 摘要。
【讨论】:
以上是关于仅当 S3 文件已更改时,如何下载它?的主要内容,如果未能解决你的问题,请参考以下文章
通过 Flutter App 的 PreSigned URL 将文件上传到 S3。但是当我下载它时文件已损坏
仅当键盘覆盖视图时如何更改 UITableView 内容插图?