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)
El objeto Key la biblioteca de boto tiene varios métodos que podrían interesarle:
Para obtener un ejemplo del uso de set_contents_from_string, consulte la sección Almacenamiento de datos de la documentación de boto, pegada aquí para completar:
>>> from boto.s3.key import Key
>>> k = Key(bucket)
>>> k.key = ''foobar''
>>> k.set_contents_from_string(''This is a test of S3'')
Puede intentar usar smart_open
( https://pypi.org/project/smart_open/ ). Lo usé exactamente para eso: escribir archivos directamente en S3.
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)