Загрузите в 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
})
Я искал всю документацию, я не мог найти ссылки, которые описывают, как это сделать, может кто-нибудь объяснить или предоставить какой-либо ресурс, где я могу найти душевное состояние?
Ответы
Ответ 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: