Как загрузить несколько файлов с одинаковым префиксом в виде имени файла из разных папок корзины S3? - PullRequest
0 голосов
/ 05 июня 2018

Допустим, у меня есть S3-контейнер с именем bucketSample.

. У меня есть разные папки, такие как abc, def и xyz.

. Теперь у меня несколькофайлы с префиксом hij_ во всех вышеупомянутых папках.

Я хочу скачать все файлы с префиксом hij_.(Например, hij_qwe.txt, hij_rty.pdf и т. Д.)

Я прошел разными способами, но для GetObject я должен предоставить конкретные имена объектов и знаю только префикс.

И с помощью TransferManager я могу загрузить все файлы папки abc, но не файлы с определенным префиксом.

Так есть ли способ, что я могу загрузить только все файлы с префиксом hij_?

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

С python вы можете использовать библиотеку boto3, которую я нашел очень полезной для решения подобного случая.

Пример кода:

import boto3
import os

KEY = ''
SECRET = ''
download_folder = os.path.join(os.path.expanduser('~'), 'Downloads')
bucket = 'bucketSample'
folders = ['abc', 'def', 'xyz']
prefixes = ['hij_']

try:
    # Needed for the pagination method in order to get objects with certain prefixes instead of iterating over all objects, you should get the aws_access_key_id and aws_secret_access_key for your bucket if available
    s3 = boto3.resource(
        's3',
        aws_access_key_id=KEY,
        aws_secret_access_key=SECRET)

    # Needed for the download method, you should get the aws_access_key_id and aws_secret_access_key for your bucket if available
    client = boto3.client(
        's3',
        aws_access_key_id=KEY,
        aws_secret_access_key=SECRET)

    # Get paginated objects
    paginator = client.get_paginator('list_objects')

    for folder in folders:
        for file_prefix in prefixes:
            prefix = folder + file_prefix
            page_iterator = paginator.paginate(Bucket=bucket, Prefix=prefix)

            if page_iterator:
                for page in page_iterator:
                    if 'Contents' in page:
                        for content in page['Contents']:
                            file_path = os.path.join(download_folder, content['Key'])
                            s3.meta.client.download_file(bucket, str(content['Key']), file_path)
except:
    print('An error occurred')
0 голосов
/ 05 июня 2018
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) { }
}

Подробнее о структуре каталогов AWS см. Здесь: Как AWS S3 хранит файлы?(структура каталогов)

Следовательно, для вашего варианта использования префикс + "/" + действует как префикс объектов, хранящихся в корзине S3.Сравнивая префикс всех объектов в S3 Bucket, вы можете получить полное имя ключа.

...