7
votes

Économiser une image à mongodb

je suis essayé de faire cela en utilisant Tornado et Pil et MongoDB.

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)  
  • Pour comprendre comment la base de données traite des images, dois-je créer une image.Save (chemin, format), mais le chemin, est-ce un chemin d'un chemin système normal (Windows ou Linux)? LI>
  • Le profil est simple et j'ai limité le téléchargement de l'image sur 500 ko, et le document de MongoDB est de 16 Mo. Le document gérera donc l'ensemble du profil, mais dois-je utiliser des gridfs même pour un petit document quand il contient une image? Le problème clé est dans la voie de l'économie d'images, je suis bloqué et c'est la première fois que je traite de la base de données, alors je suis désolé pour cette question. Li> ul> p>


3 commentaires

Je ne peux pas tout à fait suivre ce que vous essayez de faire. Avatar ressemble à un chemin de chemin de fichier que je ne vois pas utilisé pour enregistrer l'image téléchargée et je ne vois pas que vous essayez d'enregistrer les octets d'image dans le cadre d'un utilisateur Document non plus.


Formatez votre code source correctement


@Johnnyhk Désolé, parce que j'ai téléchargé seulement le fragment du code désolé pour le retard que la réponse ci-dessous m'a donné l'explication: D Merci :)


4 Réponses :


0
votes

Vous devez enregistrer des données binaires à l'aide du type de données binaire () de PymonGo.

http: //api.mongodb. Org / Python / 2.0 / API / BSON / BINARY.HTML # Module-BSON.Binary


0 commentaires

18
votes

Vous n'avez pas nécessairement besoin de gridfs pour stocker des fichiers à MongoDB, mais cela en fait sûrement une expérience plus agréable, car elle gère le fractionnement et la sauvegarde des données binaires, tout en faisant également des métadonnées disponibles. Vous pouvez ensuite stocker un identifiant dans votre document code> code> à l'image Avatar.

Donnez de côté, vous pouvez également stocker des données binaires directement dans vos documents, mais dans votre code, vous ne sauvegardez pas les données. Vous l'ouvrez simplement avec Pil.Image code>, mais alors ne faisez rien avec elle. P>

supposant que vous utilisez pymist code> pour votre chauffeur, je pense que Vous pouvez faire, c'est simplement envelopper les données binaires dans un binaire code> conteneur a>, puis stockez-le. Ceci n'est pas testé par moi, mais je suppose que cela devrait fonctionner: p>

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
    ...
}


8 commentaires

Wow! C'est ce que je cherche! Étant donné que le profil utilisera le document simple, mais les téléchargements d'utilisateurs utiliseront des gridfs et je vais ajouter la clé de «rejoindre» entre eux. Merci encore et à récupérer des données, je suppose que je vais utiliser la variable binaire_avatar! Je vous remercie!


Oui pour récupérer à nouveau, vous venez de faire un "get" avec cet identifiant qui sera stocké dans le profil utilisateur comme "avatar_id"


Bonjour, j'ai essayé le code et cela a fonctionné, ne sais pas si c'est une faute de frappe, mais c'est de bson.binaire et non pympo.binary et le get, travaillera pour les gridfs et binaires?


Pymongo utilise BSON, donc le module BSON de chaque sens. Et non, il serait complètement différent si vous avez utilisé l'approche binaire et la mettrez directement dans l'utilisateur Doc. Ce serait juste un blob binaire dans le doc. Il n'y a pas d'identifiant spécifique pour cela. Les gridfs vous donneront un identifiant pour cela comme une référence à utiliser dans votre utilisateur Doc.


Donc, d'après ce que je comprends, PIL est uniquement pour le contrôle ou le redimensionnement des images, et ce n'est pas Hime qui enregistrera la base de données, donc si je fais une vignette, où sauvegarder l'image? Ou est-ce que je l'enregistre directement à l'aide de gridfs, car je suis sangtité une différence entre le chemin de fichier de fichiersSystem et le chemin de la base de données.


et la dernière question (désolé de déranger): lorsque je vais le montrer dans le fichier HTML, comment puis-je appeler ce fichier? Gérer son propre système de fichiers (et utilisez Tornado Modèle)


Vous avez besoin de PIL pour faire des conversions, telles que faire de vos vignettes. Ces nouvelles vignettes devraient également être stockées dans les gridfs. Pour l'un de mes sites, je stocke l'image principale, puis ajoutez cet identifiant comme une pièce d'identité parent dans les métadonnées de gridfs des vignettes. Il n'y a pas de fichier FilePath car vous utilisez un mécanisme de stockage différent. Pour les servir, vous pouvez faire une vue simple qui sert l'image d'un identifiant. Pour la production, j'utilise le plugin gridfs pour NGinx, pour les avoir servi directement. Ensuite, cela ne passe pas par Django. La vue Django est juste pour Dev.


Maintenant, je reçois le code plus clair! Je vais essayer de convertir ce que vous avez dit au code, car je ne suis pas bon dessus: D Merci encore :)



14
votes

Ceci est le code pour insérer et récupérer l'image dans MongoDB sans utiliser de gridfs.

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 = '<img alt="sample" src="data:image/png;base64,{0}">'.format(decode)
    return HttpResponse(img_tag)


2 commentaires

Dans cet exemple, est request.get ["image_name"] une chaîne contenant le chemin d'accès à un fichier sur le système de fichiers? Si oui, qu'en est-il de l'étape de téléchargement de l'image? J'aimerais avoir un mécanisme de téléchargement qui insère directement dans MongoDB, manipulant le téléchargement en mémoire et n'écrire jamais un fichier sur le disque.


Ok, je l'ai compris; Mais aussi y a-t-il une raison pour laquelle vous décharges et charges les données puis la décodent à nouveau? Je trouve que je peux simplement utiliser data = db.collection.find (); imgdata = données [0] ['image']; imgtype = Data [0] ['Type']; (J'ai enregistré le contenu_type), puis renvoyez httpreesponse (' ". Format (imgtype, imgdata et pas besoin de décoder à nouveau. Juste curieux s'il y a une raison pour les décharges / charges / décodes dans le retrieve_image fn



3
votes

Il y a une erreur dans: xxx

la syntaxe correcte est la suivante: xxx

Thk vous tous pour votre support sans fin

luca


0 commentaires