Guardar y recuperar imagen desde Postgres

Alberto Valverde alberto en toscat.net
Jue Ene 24 09:44:04 CET 2008


Marcos Alcazar wrote:
> Que tal? Mi problema es otro... me parece que no esta del lado de
postgres,
> sino que no se como hacer para "formar" la imagen de nuevo sin crearla
nuevamente en disco...
>
> Esto lo logro bien (aca tengo diferencia con vos, porque me llega la
imagen
> en el request de un form de mi pag. html):
>
> file = self.request().field('archivo')
> # Aca creo un objeto que yo he definido un objeto
> # y lo mapeo con la base de datos. Yo utilizo Postgres,
> #como dije, y uso SQLAlchemy como ORM:
>
>         class ObjetoGrande(object):
>                 pass
>
>         metadata = MetaData()
>
>         objetoGrande = Table('objeto_grande' , metadata ,
>                              Column('id' , Integer , primary_key=True),
Column('nombre' , String() ,
nullable=False),
>                              Column('data' , BLOB , nullable=False) )
>         mapper(ObjetoGrande,objetoGrande)
>
>         engine =
> create_engine('postgres://postgres:postgres@localhost:5432/marcos' )
>         Session = sessionmaker(bind=engine, autoflush=True,
> transactional=True )
>         session = Session()
>
>         obj = ObjetoGrande()
>         obj.nombre = file.filename
>         obj.data = file.value
>
>         session.save(obj)
>         session.commit()
> #Y si yo hago esto, recupero la imagen y la puedo recrear en disco...
>         obj1 = session.query(ObjetoGrande).one() #Consulta ayudado por
> SQLAlchemy :)
>         archivo = open("/home/marcos/imagen.jpg", 'w')
>         archivo.write(obj1.data)
>         archivo.close()
>
> Si en este momento voy a /home/marcos, veo mi imagen completita.
Hermosa...
>
>
> Lo que yo pretendo hacer, es no tener que recrearla en disco antes de
mostrarla en alguna otra pag web, pero como no se hacer eso, tengo que
crear
> la imagen en el disco y de ahi recuperarla de la pagina...
>
> Ah... tambien use PIL.... pero es exactamente lo mismo.. pero en la base
tengo que guardar mas datos (el tamaño y el modo...) y los datos que
guardo
> es un string de pixeles que saco de la imagen a traves de img.getdata()
de
> PIL.. y ademas me caso con PIL, algo que no querria hacer...
>
> Si se te llega a ocurrir alguna solucion, por favor avisame, porque
estoy
> medio perdido en este mundo web y pythonico...

Tienes que escribir un controlador que sirva la imágen con el
content-type adecuado. Ejemplos (a ojo, sin probar...):

django:

def imagen(request, id_imagen):
    obj = session.query(ObjetoGrande).get(id_imagen)
    return HttpResponse(obj.data, "image/jpeg")

turbogears:

def imagen(self, id_imagen):
    obj = session.query(ObjetoGrande).get(id_imagen)
    cherrypy.response.headers['Content-Type'] = 'image/jpeg'
    return obj.data

pylons (>=0.9.6):

def imagen(self, id_imagen):
    obj = session.query(ObjetoGrande).get(id_imagen)
    pylons.response.headers['Content-Type'] = 'image/jpeg'
    return obj.data

Como ves, lo importante es que devuelvas el chorro de bytes de la imágen
en el contenido de la respuesta con la cabecera Content-Type adecuada para
que el navegador sepa interpretarlo. Cómo se enruta a dicho
controlador depende del framework y no me meto... obvio es que que
escribas la ruta en el atributo src del tag "img", ejemplo:

<img src="/imagen/56" />

Alberto





_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es