如何更改S3文件?

时间:2017-09-18 21:36:40

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

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

2 个答案:

答案 0 :(得分:4)

您可以使用AWS CLI的s3 sync command

  

同步目录和S3前缀。递归将新文件和更新文件从源目录复制到目标。

根据this forum thread,您可以使用def is_list_permutation(L1, L2): ''' L1 and L2: lists containing integers and strings Returns False if L1 and L2 are not permutations of each other. If they are permutations of each other, returns a tuple of 3 items in this order: the element occurring most, how many times it occurs, and its type ''' C1 = L1[:] try: for e in L2: L1.remove(e) if len(L1) != 0: return False elif len(C1) == 0: return (None, None, None) except: return False else: D = {C1.count(e): e for e in C1} # Dictionary comprehension key = max([x for x in D.keys()]) # List comprehension return (D[key], key, type(D[key])) # voilà! 仅同步一个文件:

sync

它说:同步给定路径,排除所有文件,但包括aws s3 sync s3://bucket/path/ local/path/ --exclude "*" --include "File.txt" - 因此它只会在这些给定路径下同步"File.txt"

或使用Java SDK:

根据javadoc,有一个getObjectMetadata method将返回有关S3对象(文件)的信息而不下载它的内容。

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

  

获取Last-Modified标头的值,指示Amazon S3 最后一次记录修改日期和时间

  

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

  

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

答案 1 :(得分:0)

我已使用以下代码下载时间戳大于本地文件夹时间戳的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);
                    }
                }
            }