Загрузка файла в определенную папку на S3 с помощью boto3

Все с моим кодом работает. Единственная ошибка, с которой я сейчас сталкиваюсь, заключается в том, что я не могу указать папку в ведре S3, в которую я хотел бы разместить свой файл. Вот что у меня есть:

s3.meta.client.upload_file('/tmp/'+filename, '<bucket-name>', filename)

Я пробовал оба:

s3.meta.client.upload_file('/tmp/'+filename, '<bucket-name>/folder/', filename)

и

s3.meta.client.upload_file('/tmp/'+filename, '<bucket-name>', '/folder/'+filename)

если у кого-нибудь есть советы о том, как направить это в определенную папку (если это возможно), пожалуйста, дайте мне знать!

Ответ 1

Вам не нужно передавать значение ключа как абсолютный путь. Должно работать следующее:

upload_file('/tmp/' + filename, '<bucket-name>', 'folder/{}'.format(filename))

Ответ 2

Я понял свою проблему. У меня была правильная идея с опцией /folder/ в области параметров ключа, однако мне не нужен первый / Спасибо всем! Это по существу та же идея, что и hjpotter92.

Ответ 3

Вот метод, который будет заботиться о вложенной структуре каталогов и сможет загрузить полный каталог с помощью boto

def upload_directory():
    for root, dirs, files in os.walk(settings.LOCAL_SYNC_LOCATION):
        nested_dir = root.replace(settings.LOCAL_SYNC_LOCATION, '')
        if nested_dir:
            nested_dir = nested_dir.replace('/','',1) + '/'

        for file in files:
            complete_file_path = os.path.join(root, file)
            file = nested_dir + file if nested_dir else file
            print "[S3_UPLOAD] Going to upload {complete_file_path} to s3 bucket {s3_bucket} as {file}"\
                .format(complete_file_path=complete_file_path, s3_bucket=settings.S3_BUCKET, file=file)
            s3_client.upload_file(complete_file_path, settings.S3_BUCKET, file)

Ответ 4

Используйте это для Python 3.x

s3.upload_file(file_path,bucket_name, '%s/%s' % (bucket_folder,dest_file_name))

Ответ 5

upload_file(f'/tmp/{filename}', bucket_name, 'folder/{filename}')

намного чище