【问题标题】:How do I download an S3 file only if it has changed?仅当 S3 文件已更改时,如何下载它?
【发布时间】:2018-02-27 12:54:54
【问题描述】:

我有一个 900 MB 的文件,如果尚未下载,我想从 S3 将其下载到磁盘。有没有一种简单的方法可以让我只下载尚未安装的文件?我知道 S3 支持查询文件的 MD5 校验和,但我希望不必自己构建这个逻辑。

【问题讨论】:

    标签: amazon-s3 aws-sdk aws-java-sdk


    【解决方案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:

      根据javadocgetObjectMetadata method 将返回有关 S3 对象(文件)的信息,而无需下载其内容。

      该方法返回一个ObjectMetadata 对象,它可以为您提供一些有用的信息:

      获取 Last-Modified 标头的值,指示 Amazon S3 上次记录对关联对象的修改日期和时间

      根据 RFC 1864 获取关联对象(内容 - 不包括标头)的 base64 编码的 128 位 MD5 摘要

      根据 RFC 1864 获取关联对象的十六进制编码的 128 位 MD5 摘要

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-06
        • 1970-01-01
        • 2017-02-21
        • 2014-10-02
        • 2010-09-06
        • 1970-01-01
        • 2016-01-07
        相关资源
        最近更新 更多