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