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)