sto cercando di farlo usando tornado e pil e mongodb.
avat = self.request.files['avatar'][0]["body"] nomfich = self.request.files['avatar'][0]["filename"] try: image = Image.open(StringIO.StringIO(buf=avat)) size = image.size type = image.format avatar = r"/profile-images/{0}/{1}".format(pseudo, nomfich) except IOError: self.redirect("/erreur-im")
e il codice del database:
user={ "pseudo": pseudo, "password":password, "email":email, "tel":tel, "commune":commune, "statut":statut, "nom":nom, "prenom":prenom, "daten":daten, "sexe":sexe, "avatar":avatar } self.db.essog.insert(user)
e ha funzionato bene, l ‘”avatar” è stato salvato, ma in nessuna immagine, salva solo un nome!
il mio problema è:
Non hai necessariamente bisogno di GridFS per archiviare file in MongoDB, ma sicuramente lo rende un’esperienza migliore, perché gestisce la suddivisione e il salvataggio dei dati binari, rendendo anche disponibili i metadati. È quindi ansible memorizzare un ID nel documento User
nell’immagine dell’avatar.
A parte questo, puoi anche memorizzare i dati binari direttamente nei tuoi documenti, anche se nel tuo codice non stai salvando i dati. Lo stai semplicemente aprendo con PIL.Image
, ma poi non fai nulla con esso.
Supponendo che tu stia usando pymongo
per il tuo driver, penso che quello che puoi fare è semplicemente racchiudere i dati binari in un contenitore Binary
e quindi memorizzarli. Questo non è stato verificato da me, ma presumo che dovrebbe funzionare:
from pymongo.binary import Binary binary_avatar = Binary(avat) user={ ... "avatar":avatar, "avatar_file": binary_avatar ... }
Detto questo … basta renderlo più facile per te e usare GridFS . Questo è ciò a cui è destinato.
Se si dovesse utilizzare GridFS, potrebbe apparire come questo:
from gridfs import GridFS avat_ctype = self.request.files['avatar'][0]["content_type"] fs = GridFS(db) avatar_id = fs.put(avat, content_type=avat_ctype, filename=nomfich) user={ ... "avatar_name":avatar, "avatar_id": avatar_id ... }
Questo è il codice per inserire e recuperare l’immagine in mongodb senza usare gridf.
def insert_image(request): with open(request.GET["image_name"], "rb") as image_file: encoded_string = base64.b64encode(image_file.read()) print encoded_string abc=db.database_name.insert({"image":encoded_string}) return HttpResponse("inserted") def retrieve_image(request): data = db.database_name.find() data1 = json.loads(dumps(data)) img = data1[0] img1 = img['image'] decode=img1.decode() img_tag = '
'.format(decode) return HttpResponse(img_tag)
È necessario salvare i dati binari usando il tipo di dati Binary () di pymongo.
http://api.mongodb.org/python/2.0/api/bson/binary.html#module-bson.binary
Prova ad usare carierwave-mongoid https://github.com/jnicklas/carrierwave-mongoid Penso che sia un modo semplice e facile per te in questo caso
c’è un errore in:
from pymongo.binary import Binary
la syntax corretta è:
from bson.binary import Binary
tutti voi per il vostro infinito supporto
luca