Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从S3 bucket的不同文件夹下载多个前缀与文件名相同的文件?_Java_Amazon Web Services_Amazon S3_Aws Sdk_Awss3transfermanager - Fatal编程技术网

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