Saltar al contenido

Cargue la imagen disponible en la URL pública a S3 usando boto

Solución:

Ok, de @garnaat, no parece que S3 actualmente permita cargas por URL. Logré subir imágenes remotas a S3 leyéndolas solo en la memoria. Esto funciona.

def upload(url):
    try:
        conn = boto.connect_s3(settings.AWS_ACCESS_KEY_ID, settings.AWS_SECRET_ACCESS_KEY)
        bucket_name = settings.AWS_STORAGE_BUCKET_NAME
        bucket = conn.get_bucket(bucket_name)
        k = Key(bucket)
        k.key = url.split("https://foroayuda.es/")[::-1][0]    # In my situation, ids at the end are unique
        file_object = urllib2.urlopen(url)           # 'Like' a file object
        fp = StringIO.StringIO(file_object.read())   # Wrap object    
        k.set_contents_from_file(fp)
        return "Success"
    except Exception, e:
        return e

También gracias a ¿Cómo puedo crear una instancia de GzipFile a partir del “objeto similar a un archivo” que devuelve urllib.urlopen ()?

Así es como lo hice con las solicitudes, la clave es configurar stream=True al realizar la solicitud inicialmente, y cargar a s3 usando el upload.fileobj() método:

import requests
import boto3

url = "https://upload.wikimedia.org/wikipedia/en/a/a9/Example.jpg"
r = requests.get(url, stream=True)

session = boto3.Session()
s3 = session.resource('s3')

bucket_name="your-bucket-name"
key = 'your-key-name' # key is the name of file on your bucket

bucket = s3.Bucket(bucket_name)
bucket.upload_fileobj(r.raw, key)

Para obtener una respuesta relevante para 2017 a esta pregunta que utiliza el paquete oficial ‘boto3’ (en lugar del antiguo paquete ‘boto’ de la respuesta original):

Python 3.5

Si tiene una instalación limpia de Python, pip instale ambos paquetes primero:

pip install boto3

pip install requests

import boto3
import requests

# Uses the creds in ~/.aws/credentials
s3 = boto3.resource('s3')
bucket_name_to_upload_image_to = 'photos'
s3_image_filename="test_s3_image.png"
internet_image_url="https://docs.python.org/3.7/_static/py.png"


# Do this as a quick and easy check to make sure your S3 access is OK
for bucket in s3.buckets.all():
    if bucket.name == bucket_name_to_upload_image_to:
        print('Good to go. Found the bucket to upload the image into.')
        good_to_go = True

if not good_to_go:
    print('Not seeing your s3 bucket, might want to double check permissions in IAM')

# Given an Internet-accessible URL, download the image and upload it to S3,
# without needing to persist the image to disk locally
req_for_image = requests.get(internet_image_url, stream=True)
file_object_from_req = req_for_image.raw
req_data = file_object_from_req.read()

# Do the actual upload to s3
s3.Bucket(bucket_name_to_upload_image_to).put_object(Key=s3_image_filename, Body=req_data)
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *