example aws python amazon-s3 amazon

python - aws - Cómo cargar un archivo a S3 sin crear un archivo local temporal



python s3 (6)

¿Existe alguna forma viable de cargar un archivo que se genere dinámicamente en Amazon s3 directamente sin primero crear un archivo local y luego cargarlo al servidor s3? Yo uso python. Gracias


Aquí hay un ejemplo descargando una imagen (usando la biblioteca de solicitudes) y cargándola a s3, sin escribir en un archivo local:

import boto from boto.s3.key import Key import requests #setup the bucket c = boto.connect_s3(your_s3_key, your_s3_key_secret) b = c.get_bucket(bucket, validate=False) #download the file url = "http://en.wikipedia.org/static/images/project-logos/enwiki.png" r = requests.get(url) if r.status_code == 200: #upload the file k = Key(b) k.key = "image1.png" k.content_type = r.headers[''content-type''] k.set_contents_from_string(r.content)




Puedes usar BytesIO de la biblioteca estándar de Python.

from io import BytesIO bytesIO = BytesIO() bytesIO.write(''whee'') bytesIO.seek(0) s3_file.set_contents_from_file(bytesIO)


Supongo que estás usando boto . Bucket.set_contents_from_file() boto aceptará un objeto StringIO , y cualquier código que haya escrito para escribir datos en un archivo debe ser fácilmente adaptable para escribir en un objeto StringIO . O si genera una cadena, puede usar set_contents_from_string() .


def upload_to_s3(url, **kwargs): '''''' :param url: url of image which have to upload or resize to upload :return: url of image stored on aws s3 bucket '''''' r = requests.get(url) if r.status_code == 200: # credentials stored in settings AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY conn = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, host=AWS_HOST) # Connect to bucket and create key b = conn.get_bucket(AWS_Bucket_Name) k = b.new_key("{folder_name}/{filename}".format(**kwargs)) k.set_contents_from_string(r.content, replace=True, headers={''Content-Type'': ''application/%s'' % (FILE_FORMAT)}, policy=''authenticated-read'', reduced_redundancy=True) # TODO Change AWS_EXPIRY return k.generate_url(expires_in=AWS_EXPIRY, force_http=True)