Java 如何从S3 bucket的不同文件夹下载多个前缀与文件名相同的文件?
假设我有一个名为Java 如何从S3 bucket的不同文件夹下载多个前缀与文件名相同的文件?,java,amazon-web-services,amazon-s3,aws-sdk,awss3transfermanager,Java,Amazon Web Services,Amazon S3,Aws Sdk,Awss3transfermanager,假设我有一个名为bucketSample的S3存储桶 我有不同的文件夹,如abc,def和xyz 现在,在上述所有文件夹中,我有多个文件的前缀为hij 我想下载所有带有前缀的文件hij.。(例如,hij_qwe.txt,hij_rty.pdf等) 我已经经历了各种方法,但是对于GetObject我必须提供特定的对象名称,并且我只知道前缀 使用TransferManager,我可以下载文件夹abc的所有文件,但不能只下载带有特定前缀的文件 那么有没有办法让我只能下载所有前缀为hij的文件?publ
bucketSample
的S3存储桶
我有不同的文件夹,如abc
,def
和xyz
现在,在上述所有文件夹中,我有多个文件的前缀为hij
我想下载所有带有前缀的文件hij.
。(例如,hij_qwe.txt
,hij_rty.pdf
等)
我已经经历了各种方法,但是对于GetObject
我必须提供特定的对象名称,并且我只知道前缀
使用TransferManager,我可以下载文件夹abc
的所有文件,但不能只下载带有特定前缀的文件
那么有没有办法让我只能下载所有前缀为hij
的文件?public void getFiles(最终设置bucketName、最终设置密钥、最终设置前缀){
public void getFiles(final Set<String> bucketName, final Set<String> keys, final Set<String> prefixes) {
try {
ObjectListing objectListing = s3Client.listObjects(bucketName); //lists all the objects in the bucket
while (true) {
for (Iterator<?> iterator = objectListing.getObjectSummaries().iterator();
iterator.hasNext(); ) {
S3ObjectSummary summary = (S3ObjectSummary) iterator.next();
for (String key : keys) {
for (String prefix : prefixes)
if (summary.getKey().startsWith(key + "/" prefix)) {
//HERE YOU CAN GET THE FULL KEY NAME AND HENCE DOWNLOAD IT IN NEW FILE USING THE TRANFER MANAGER
}
}
}
}
if (objectListing.isTruncated()) {
objectListing = s3Client.listNextBatchOfObjects(objectListing);
} else {
break;
}
}
} catch (AmazonServiceException e) { }
}
试一试{
ObjectListing ObjectListing=s3Client.listObjects(bucketName);//列出bucket中的所有对象
while(true){
for(Iterator Iterator=objectListing.getObjectSummaries().Iterator();
迭代器.hasNext();){
S3ObjectSummary=(S3ObjectSummary)迭代器.next();
用于(字符串键:键){
for(字符串前缀:前缀)
if(summary.getKey().startsWith(key+“/”前缀)){
//在这里,您可以获得完整的密钥名,并使用Transfer MANAGER将其下载到新文件中
}
}
}
}
if(objectListing.isTruncated()){
objectListing=s3Client.listNextBatchOfObjects(objectListing);
}否则{
打破
}
}
}catch(AmazonServiceException e){}
}
请阅读此处的AWS目录结构:
因此,对于您的用例,key+“/”+prefix充当存储在S3 bucket中的对象的前缀。通过将前缀与S3存储桶中的所有对象进行比较,可以获得完整的密钥名称。public void getFiles(最终设置的bucketName、最终设置的密钥、最终设置的前缀){
试一试{
ObjectListing ObjectListing=s3Client.listObjects(bucketName);//列出bucket中的所有对象
while(true){
for(Iterator Iterator=objectListing.getObjectSummaries().Iterator();
迭代器.hasNext();){
S3ObjectSummary=(S3ObjectSummary)迭代器.next();
用于(字符串键:键){
for(字符串前缀:前缀)
if(summary.getKey().startsWith(key+“/”前缀)){
//在这里,您可以获得完整的密钥名,并使用Transfer MANAGER将其下载到新文件中
}
}
}
}
if(objectListing.isTruncated()){
objectListing=s3Client.listNextBatchOfObjects(objectListing);
}否则{
打破
}
}
}catch(AmazonServiceException e){}
}
请阅读此处的AWS目录结构:
因此,对于您的用例,key+“/”+prefix充当存储在S3 bucket中的对象的前缀。通过将前缀与S3 Bucket中的所有对象进行比较,您可以获得完整的密钥名。对于python,您可以使用boto3库,我发现它对于解决类似情况非常有用 示例代码:
导入boto3
导入操作系统
键=“”
秘密=“”
download\u folder=os.path.join(os.path.expanduser(“~”),“Downloads”)
bucket='bucketSample'
文件夹=['abc','def','xyz']
前缀=['hij_u']
尝试:
#分页方法需要获取具有特定前缀的对象,而不是遍历所有对象,您应该获取bucket的aws_access_key_id和aws_secret_access_key(如果可用)
s3=boto3.0资源(
“s3”,
aws\u访问\u密钥\u id=密钥,
aws_secret_access_key=secret)
#下载方法需要的是,您应该为您的bucket获取aws_access_key_id和aws_secret_access_key(如果可用)
client=boto3.client(
“s3”,
aws\u访问\u密钥\u id=密钥,
aws_secret_access_key=secret)
#获取分页对象
paginator=client.get_paginator('list_objects'))
对于文件夹中的文件夹:
对于前缀中的文件前缀:
前缀=文件夹+文件前缀
页面迭代器=paginator.paginate(Bucket=Bucket,Prefix=Prefix)
如果页面迭代器:
对于页面迭代器中的页面:
如果第页中有“内容”:
对于第['Contents']页中的内容:
file_path=os.path.join(下载_文件夹,内容['Key'])
s3.meta.client.download_文件(bucket,str(content['Key']),文件路径)
除:
打印('发生错误')
对于python,您可以使用boto3库,我发现它对于解决类似情况非常有用
示例代码:
导入boto3
导入操作系统
键=“”
秘密=“”
download\u folder=os.path.join(os.path.expanduser(“~”),“Downloads”)
bucket='bucketSample'
文件夹=['abc','def','xyz']
前缀=['hij_u']
尝试:
#分页方法需要获取具有特定前缀的对象,而不是遍历所有对象,您应该获取bucket的aws_access_key_id和aws_secret_access_key(如果可用)
s3=boto3.0资源(
“s3”,
aws\u访问\u密钥\u id=密钥,
aws_secret_access_key=secret)
#下载方法需要的是,您应该为您的bucket获取aws_access_key_id和aws_secret_access_key(如果可用)
client=boto3.client(
“s3”,
aws\u访问\u密钥\u id=密钥,
aws_secret_access_key=secret)
#获取分页对象
paginator=cli