Primero bajamos la imagen a memoria con algún gestor (pycurl por ejemplo o urllib) y guardarlo en un cStringIO:
import pycurl, cStringIO
buf = cStringIO.StringIO()
url=('ftps://%s:990/%s' % (ip, fichero))
privatekey = '/home/sss/.ssh/id_rsa'
options = {
pycurl.USERPWD: 'xxxxx:xxxx',
pycurl.SSLKEYPASSWD: 'adfasdfasdfas',
pycurl.SSH_PRIVATE_KEYFILE: privatekey,
pycurl.SSH_PUBLIC_KEYFILE: privatekey + '.pub',
#pycurl.WRITEDATA: open('/dev/null', 'wb'),
pycurl.VERBOSE: 1,
pycurl.URL: url,
pycurl.HEADER: 1,
pycurl.NOBODY: 1,
pycurl.WRITEFUNCTION: buf.write,
pycurl.NOPROGRESS: 1,
pycurl.SSL_VERIFYPEER: 0,
pycurl.SSL_VERIFYHOST: 0,
}
gestor = pycurl.Curl()
try:
for (k, v) in options.items():
print k, v
gestor.setopt(k, v)
except Exception, msg:
logging.info('Error setopt %s' % msg)
gestor.perform()
Ahora ya tenemos la imagen en memoria (buf), vamos a grabarla (django la graba en disco y en la db solo se guarda el path), el único problema es que ImageField espera un campo file, pero lo solucionaremos con un workaround:
En tu modelo pones:
class Persona(models.Model):
.....
imagen=models.ImageField(upload_to=settings.PATH_FOTOS_CLIENTES, blank=True)
Donde settings.PATH_FOTOS_CLIENTES apunta a la ruta que cuelga de la ruta que tengas en settings.MEDIA_ROOT y tiene el formato siguiente o similar (en settings.py):
PATH_FOTOS_CLIENTES='clientes/%Y/%m/%d'
Ahora tenemos que pasar de la imagen que tienes cargada en memoria a un stream tipo 'file' para que pueda ser guardado por el modelo:
from django.core.files.uploadedfile import SimpleUploadedFile
foto = SimpleUploadedFile('imagencliente.jpg',
buf.getvalue(),
"image/jpeg")
y ya salvamos:
p=Persona( imagen=foto )
p.save()
Comentad si os surge alguna duda.
Saludos,
Pere Vilás.
2 comentarios:
Hola, muy útil el artículo.
Me puse a utilizar el código que publicaste, y todo va bien en la base de datos, pero la iamgen no se desccarga correctamente, me crea un archivo jpg que en realidad es un archivo de texto con este contenido:
HTTP/1.1 200 OK
Accept-Ranges: bytes
Date: Thu, 10 Mar 2011 16:10:52 GMT
Content-Length: 8038
Content-Type: image/jpeg
Server: Apache/2.2.9 (Unix) PHP/5.2.6
Last-Modified: Thu, 13 Dec 2007 05:10:29 GMT
ETag: "2820-1f66-44123f6e97b40"
Sabes que puede causar esto?
Muchas Gracias
Hum, parece un tema de configuración del pycurl, parece que estás pidiendo el "head" del fichero en vez del contenido. Tendrías que mirar la petición que le haces exactamente al servidor.
Publicar un comentario