Guardar y recuperar imagen desde Postgres

Marcos Alcazar marcos.alcazar en gmail.com
Jue Ene 24 13:06:11 CET 2008


Gracias Alberto, eso es bueno, muy bueno... Tal vez tengas idea de como
hacer lo mismo sin atarme a ningun framework web? Podria ser que mi
controlador extienda de alguna clase como por ejemplo la
BaseHTTPRequestHandler o alguna de BaseHTTPServer, por decir algo. En
realidad no conozco mucho, pero cuento con la ayuda de un gran compañero de
trabajo que me guia de a poco.

Tal vez vos o alguien podria podria recomendarme alguno de esos frameworks
que nombras? Ventajas y desventajas? Me conviene jugarme por uno y depender
directamente de alguno de ellos, o sera mejor seguir desarrollando sin
jugarme por alguno?

Muchas gracias por toda su ayuda!

Marcos Alcazar

On Jan 24, 2008 6:44 AM, Alberto Valverde <alberto en toscat.net> wrote:

> 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
>
_______________________________________________
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