salvando la foto in mongodb

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 è:

  • per capire come il database si occupa delle immagini, devo creare image.save (percorso, formato), ma il percorso, è un percorso di un normale percorso di sistema (windows o linux)?
  • il profilo è semplice, e ho limitato il caricamento dell’immagine a 500ko, e il documento in mongodb è 16mb, quindi il documento gestirà l’intero profilo, ma devo usare gridFS anche per documenti di piccole dimensioni quando contiene immagini? il problema chiave è nel percorso del salvataggio delle immagini, sono bloccato, ed è la prima volta che mi occupo di database, quindi mi dispiace per quella domanda.

    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 = 'sample'.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