2009-03-15 5 views
7

J'utilise PyAMF pour transférer une grande image générée dynamiquement de Flex vers Django. Sur le côté Django, je reçois les données encodedb64 en tant que paramètre:Gestion de fichiers dans Django lors de la publication d'une image à partir d'un appel de service

Mon modèle d'élément sous forme de champ image. Ce que j'ai de la difficulté à faire est d'enregistrer les données sous le nom de File Django Field.

def save_item(request, uname, data): 
    """ Save a new item """  
    item = Item() 

    img = cStringIO.StringIO() 
    img.write(base64.b64decode(data)) 
    myFile = File(img) 

    item.preview.save('fakename.jpg', myFile, save=False) 

Cela ne fonctionnerait pas parce que mon objet File de StringIO manque certaines propriétés telles que le mode, le nom, etc

Je pense aussi que l'utilisation StringIO charge les données d'image complètement en mémoire ce qui est mauvais pour que je peut simplement abandonner l'AMF pour ce cas particulier et utiliser POST.

Qu'en pensez-vous?

Répondre

9

Dans django.core.files.base vous pouvez trouver la classe ContentFile. Cette classe étend la classe de base Django File, donc vous n'avez pas besoin de StringIO (que ContentFile utilise en interne). La méthode de sauvegarde modifiée ressemble à ceci:

from django.core.files.base import ContentFile 
def save_item(request, uname, data): 
    item = Item() 
    myFile = ContentFile(base64.b64decode(data)) 
    item.preview.save('fakename.jpg', myFile, save=False) 
Questions connexes