Подтвердить что ты не робот

Загрузите в Amazon S3 с помощью Boto3 и верните общедоступный URL-адрес

Я пытаюсь загрузить файлы на s3 с помощью Boto3 и сделать этот загруженный файл общедоступным и вернуть его в качестве URL-адреса.

class UtilResource(BaseZMPResource):
class Meta(BaseZMPResource.Meta):
    queryset = Configuration.objects.none()
    resource_name = 'util_resource'
    allowed_methods = ['get']

def post_list(self, request, **kwargs):

    fileToUpload = request.FILES
    # write code to upload to amazone s3
    # see: https://boto3.readthedocs.org/en/latest/reference/services/s3.html


    self.session = Session(aws_access_key_id=settings.AWS_KEY_ID,
                  aws_secret_access_key=settings.AWS_ACCESS_KEY,
                  region_name=settings.AWS_REGION)

    client = self.session.client('s3')
    client.upload_file('zango-static','fileToUpload')


    url = "some/test/url"
    return self.create_response(request, {
        'url': url // return public url of uploaded file 
    })

Я искал всю документацию, я не мог найти ссылки, которые описывают, как это сделать, может кто-нибудь объяснить или предоставить какой-либо ресурс, где я могу найти душевное состояние?

4b9b3361

Ответ 1

Я в той же ситуации. Не удалось найти что-либо в документах Boto3 вне generate_presigned_url, что не является тем, что мне нужно в моем случае, поскольку у меня есть общедоступные читаемые объекты S3.

Лучшее, что я придумал, это:

bucket_location = boto3.client('s3').get_bucket_location(Bucket=s3_bucket_name)
object_url = "https://s3-{0}.amazonaws.com/{1}/{2}".format(
    bucket_location['LocationConstraint'],
    s3_bucket_name,
    key_name)

Вы можете попробовать разместить в список boto3 github для лучшего решения.

Ответ 2

У меня была такая же проблема. Предполагая, что вы знаете имя ведра, в котором хотите сохранить данные, вы можете использовать следующее:

import boto3
from boto3.s3.transfer import S3Transfer

credentials = { 
    'aws_access_key_id': aws_access_key_id,
    'aws_secret_access_key': aws_secret_access_key
}

client = boto3.client('s3', 'us-west-2', **credentials)
transfer = S3Transfer(client)

transfer.upload_file('/tmp/myfile', bucket, key,
                     extra_args={'ACL': 'public-read'})

file_url = '%s/%s/%s' % (client.meta.endpoint_url, bucket, key)

Ответ 3

Лучшее решение, которое я нашел, все еще использует generate_presigned_url, просто чтобы Client.Config.signature_version нужно было установить botocore.UNSIGNED.

Следующее возвращает общедоступную ссылку без подписи.

config.signature_version = botocore.UNSIGNED
boto3.client('s3', config=config).generate_presigned_url('get_object', ExpiresIn=0, Params={'Bucket': bucket, 'Key': key})

Соответствующие обсуждения в репозитории boto3: