Estoy cambiando el tamaño de las imágenes del lado del cliente antes de enviarlas a mi aplicación de matraz.
La imagen redimensionada, que se dibuja en un lienzo para cambiar el tamaño, se envía a través de una solicitud POST.
En mi aplicación, la imagen se decodifica a través de base64:
def resize_image(item): content = item.split(';')[1] image_encoded = content.split(',')[1] body = base64.decodestring(image_encoded.encode('utf-8')) return body Los datos de la imagen se almacenan como type String en la variable del body . Puedo guardar los datos en mi máquina local y funciona:
filename = 'some_image.jpg' with open(filename, 'wb') as f: print "written" f.write(body) Lo que necesito es subir la imagen redimensionada a AWS3. En un punto, necesito read() el contenido de la imagen, pero hasta que la imagen se guarde en algún lugar como un archivo, sigue siendo una Cadena, por lo que falla:
file_data = request.values['a'] imagedata = resize_image(file_data) s3 = boto.connect_s3(app.config['MY_AWS_ID'], app.config['MY_AWS_SECRET'], host='s3.eu-central-1.amazonaws.com') bucket_name = 'my_bucket' bucket = s3.get_bucket(bucket_name) k = Key(bucket) # fails here file_contents = imagedata.read() k.key = "my_images/" + "test.png" k.set_contents_from_string(file_contents)A menos que haya otra solución, pensé en guardar la imagen temporalmente en mi servidor (Heroku) y subirla y luego eliminarla, ¿cómo funcionaría esto? ¡Eliminar después es importante aquí!
set_contents_from_string toma una cadena como parámetro, probablemente podría simplemente pasarle los datos de la cadena de imagen directamente para cargarlos en S3
Solución:
Eliminar esta parte:
file_contents = imagedata.read() Utilice imagedata directamente aquí:
k.set_contents_from_string(imagedata)Si necesita llamar a .read() en sus datos, pero no necesita guardar el archivo en el disco, use StringIO:
import StringIO output = StringIO.StringIO() output.write('decoded image') output.seek(0) output.read() Out[1]: 'decoded image'