Subir imagen redimensionada a S3

Estoy intentando subir una imagen redimensionada a S3:

fp = urllib.urlopen('http:/example.com/test.png') img = cStringIO.StringIO(fp.read()) im = Image.open(img) im2 = im.resize((500, 100), Image.NEAREST) AK = 'xx' # Access Key ID SK = 'xx' # Secret Access Key conn = S3Connection(AK,SK) b = conn.get_bucket('example') k = Key(b) k.key = 'example.png' k.set_contents_from_filename(im2) 

pero me sale un error:

  in set_contents_from_filename fp = open(filename, 'rb') TypeError: coercing to Unicode: need string or buffer, instance found 

Debe convertir su imagen de salida en un conjunto de bytes antes de poder subir a s3. Puede escribir la imagen en un archivo y luego cargar el archivo, o puede usar un objeto cStringIO para evitar escribir en el disco como lo he hecho aquí:

 import boto import cStringIO import urllib import Image #Retrieve our source image from a URL fp = urllib.urlopen('http://example.com/test.png') #Load the URL data into an image img = cStringIO.StringIO(fp.read()) im = Image.open(img) #Resize the image im2 = im.resize((500, 100), Image.NEAREST) #NOTE, we're saving the image into a cStringIO object to avoid writing to disk out_im2 = cStringIO.StringIO() #You MUST specify the file type because there is no file name to discern it from im2.save(out_im2, 'PNG') #Now we connect to our s3 bucket and upload from memory #credentials stored in environment AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY conn = boto.connect_s3() #Connect to bucket and create key b = conn.get_bucket('example') k = b.new_key('example.png') #Note we're setting contents from the in-memory string provided by cStringIO k.set_contents_from_string(out_im2.getvalue()) 

Mi conjetura es que Key.set_contents_from_filename espera un solo argumento de cadena, pero está pasando im2 , que es otro tipo de objeto devuelto por Image.resize . Creo que necesitará escribir su imagen redimensionada en el sistema de archivos como un archivo de nombre y luego pasar ese nombre de archivo a k.set_contents_from_filename . De lo contrario, busque otro método en la clase Key que pueda obtener el contenido de la imagen de una construcción en memoria (StringIO o alguna instancia de objeto).

 print ("loading object", input_bucket, input_key) response = s3client.get_object(Bucket=input_bucket, Key=input_key) print("s3 get object response", response) body = response['Body'] image = Image.open(body) print ("generating thumbnail", output_width, output_height) thumbnail = resizeimage.resize_thumbnail( image, [output_width, output_height]) body.close() print ("saving thumbnail", output_format) with io.BytesIO() as output: thumbnail.save(output, output_format) print ("uploading thumbnail", output_bucket, output_key) output.seek(0) s3client.put_object(Bucket=output_bucket, Key=output_key, Body=output, ContentType=output_content_type)