仅当 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 内容插图?

仅当它们已更改时才强制浏览器重新加载 css/js

仅当子目录中的文件已更改时,才运行VSTS构建任务以运行“npm build”

`aws s3 sync` 如何确定文件是不是已更新?

Spark 失败,因为 S3 文件已更新。如何消除这个错误?