Imagen de carga de Django: de un formulario a Rackspace / S3 sin manipulación

Simplemente quiero cargar una imagen (JPG) utilizando un formulario, luego enviar esa imagen a Rackspace ‘Cloud Files’ o Amazon ‘S3’.

  • No manipular el archivo.
  • Sin guardar en disco, todo en la memoria (estoy alojado en un servidor en la nube)
  • El tamaño de la imagen no excederá 75kb

Actualización (dos advertencias):

  • Uno: también debe funcionar cuando los datos se publican desde una aplicación de teléfono.
  • Dos: debe enviarse a Rackspace Cloud Files así como a S3 (comenzando con CF).

El siguiente código funciona, pero es demasiado pesado.

import cloudfiles as cf def uploadImage(request, id): cf_con = cf.get_connection(username='YYY', api_key='XXX', serviceNet=True) container = cf_con.get_container('container_name') file = request.FILES["item_photo"] f = StringIO(file.read()) f = Image.open(f) ### Only works if I resize for some reason, otherwise uploads a broken file image = f.resize((600,600), Image.ANTIALIAS) o = StringIO() image.save(o, "JPEG", quality=80) image = o.getvalue() file_name = "%s/%s" % (id, '600x600.jpeg') ### This simply uploads to Rackspace Cloud files. put_file(container, file_name, image) 

Muchas gracias, espero que todo esté bien …

re.

¿Qué tal si ignoramos Python todos juntos y simplemente subimos directamente a s3?

Puede configurar su cubeta s3 para no permitir que se carguen archivos de más de $ X bytes.

Aquí hay un ejemplo simple para ilustrar la carga directa a s3 (e ignorar las condiciones de ancho / altura de la imagen)

http://sente.cc/upload_to_s3.html

código:

      

refresh the page after you've submitted to see your new image


name of key:


http://s3.amazonaws.com/dev.sente/image.jpg

Resuelto. Encontró un enfoque más simple y elegante y me siento estúpido por no haber llegado antes.

 file = request.FILES["item_photo"] file_name = "%s/%s" % (id, '600.jpeg') put_file(container, file_name, file.read())