django-models - s3boto3storage - django-storages
Cargue en Amazon S3 usando Boto3 y devuelva la url pública (2)
Estoy tratando de subir archivos a s3 usando Boto3 y hacer público ese archivo cargado y devolverlo como una 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''s public url of uploaded file
})
Busqué en toda la documentación que no pude encontrar ningún enlace que describa cómo hacer esto. ¿Alguien puede explicar o proporcionar algún recurso donde pueda encontrar el alma?
Estoy en la misma situación. No puedo encontrar nada en los documentos de Boto3 más allá de generate_presigned_url, que no es lo que necesito en mi caso ya que tengo objetos S3 legibles para el público.
Lo mejor que se me ocurrió fue:
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)
Puede intentar publicar en la lista de problemas de boto3 github para una mejor solución.
Tuve el mismo problema. Suponiendo que conoce el nombre del depósito en el que desea almacenar sus datos, puede usar lo siguiente:
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)